13

OCJP 認定のシミュレーションで、次の質問を見つけました。

1. StringBuffer s1 = new StringBuffer("abc");
2. StringBuffer s2 = s1;
3. StringBuffer s3 = new StringBuffer("abc");

How many objects are created ?

彼らは、次のように述べているため、正解は 4 であると述べています。

s1 is one object, s2 is another object, 
s3 is another object and "abc" is another String Object .

しかし、私にとっては間違っていて、s1s2が同じオブジェクトであるため、3 である必要があります。どう思いますか?

4

5 に答える 5

8

あなたの答えが 4 つのオブジェクトではないというのは正しいです。

ただし、「いくつのオブジェクトが作成されるか」という質問はあいまいです。問題は、コードを実行したときに 3 つのオブジェクトのいずれかが作成されないことです。具体的には、リテラルStringに対応するオブジェクトは、コードのロード時に実際に作成されます。そのコードが実行されると、2 つのオブジェクトが作成され、既存のオブジェクトが使用されます。"abc"StringBufferString

Stringクラスのロード時に別の一時オブジェクトが作成され、インターン後に破棄される可能性があるため、実際にはそれよりも複雑です。

  • "abc"リテラルが別のクラスに既にロードされている 場合は、そのクラスが使用されます。

  • Stringプールに入れる必要がある場合、文字列プールの実装が の新しいコピーを作成するかどうかは指定されていません。

質問がより正確に述べられていない限り、単一の正解はありません。あなたが言える最高のことは次のとおりです。

  • コードを実行すると、 2 つStringBufferのオブジェクトが作成されます。
  • コードが読み込まれると、 1 つまたは 2 つのStringオブジェクトが作成されます。

次に、 andオブジェクトchar[]の一部を形成するプライベート オブジェクトをカウントする必要があるかどうかという問題があります。これにより、オブジェクト数が最大 8 まで増加する可能性があります。StringBufferString

于 2013-08-18T10:54:25.257 に答える