3

Oracle CertifiedJavaProgrammer認定の模擬テストをいくつか行っています。私がテストで見つけた質問の1つはこれです:

public String makinStrings() { 
 String s = “Fred”; 
 s = s + “47”; 
 s = s.substring(2, 5); 
 s = s.toUpperCase(); 
 return s.toString();
}

そして、問題は「このメソッドが呼び出されたときにいくつのStringオブジェクトが作成されるか」です。「Fred」、「47」、「Fred47」、サブストリング「ed4」、大文字のストリング「ED4」の5つを数えていますが、質問の答えは3つのオブジェクトです(テストが行​​われているドキュメントにはありません)説明セクション)。私のエラーはどこにあるのか指摘できますか?

4

3 に答える 3

4

文字列「Fred」と「47」は静的です。つまり、メソッドが呼び出されたときではなく、クラスがロードされたときに作成されます。

于 2011-11-22T15:59:23.927 に答える
4

エラーは、「このメソッドが呼び出されたときにオブジェクトが作成される文字列の数」の解釈にあるように聞こえます

あなたは5つの文字列が関係していると述べているのは正しいです。makinStrings()ただし、文字列は不変であり、そのうちの2つは、メソッドを含むクラスにコンパイルされる定数です。そのため、5つのうち2つはメソッドの呼び出しがすでに存在し、3つの「新しい」文字列のみが作成されます。

2つの定数文字列はクラスの定数プールに存在し、クラスのロード時に作成されました。

于 2011-11-22T15:59:33.503 に答える
1

私が見ることができる最高のもの:

public String makinStrings() { 
 String s = “Fred”; 

「Fred」は、クラスのロード時に作成され、文字列プールに追加される文字列リテラルです。割り当てられたときにオブジェクトは作成されません。割り当ては、既存の文字列への参照を渡すだけです。

 s = s + “47”; 

ここでは、sの前の値とリテラル「47」の組み合わせとして新しい文字列が作成されます。(1)

 s = s.substring(2, 5);

substring()は文字列自体を操作しません(文字列はJavaでは不変です)。むしろ、メソッドの戻り値である新しい文字列を返します。(2)

 s = s.toUpperCase();

前の行と同じ理由で、新しい文字列。(3)

  return s.toString();
}

StringクラスのtoString()は、String自体への参照を返します。新しいオブジェクトは作成されません。

したがって、3は正解のように聞こえます。

于 2011-11-22T16:06:32.487 に答える