2016-11-24 13 views
0

Javaが他のStringへのポインタを作成するかどうかは疑問です。それはポインタである可能性がJavaは新しい文字列または文字列へのポインタを作成しますか?

一例:

App app = new App("name"); 
String name = app.getName(); 

私はString nameapp.setName("newName")に変更に値を初期化されている場合は、String nameの値は変更されません。 これは、String nameがポインタではなく新しいStringであることを示しています。

でも、そうかもしれませんね。私はポインタ(メモリまたは文字列名のString name)がメモリを節約するために変更されるまで、ポインタになる可能性がありますか?

これはこれまでのポインタですか?

同じ質問ではありません:String Interning 具体的にはString Interningの説明を求めています。例:String.intern()

+2

[What is String interning?]の複製があります(http://stackoverflow.com/questions/10578984/what-is-string-interning) – SomeJavaGuy

+1

これは常にポインタですが、Stringオブジェクトはあなたのままでは不変です – JonK

+0

ポインタを要求する:[Javaの "値渡し"または "参照渡し"](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-値によって) – SomeJavaGuy

答えて

2

オブジェクトへの参照はすべてポインタです。ただし、setNameはポインタの値を変更します。つまり、ポインタを別の場所にポイントします。また、Stringは不変で内部化されているため、値ごとに1つのインスタンスが常に存在し、変更されることはありません。

+0

*「オブジェクトへのすべての参照はポインタです」*いいえ、そうではありません。** Javaポインタはありません**。ポインタのような参照を簡単に扱えるようにすることはできますが、そうではありません。 –

+0

Javaにはポインタがありませんか?メモリ内のいくつかのデータにリンクされている参照はポインタではありませんか? C/C++のネイティブポインタとの唯一の違いは、ポインタがどこにあるかをループまたは変更するために算術演算を実行できないことです。 – AntJavaDev

+1

@TimothyTruckle javaにはCのような手動管理のポインタはありませんがポインタのように動作します:メモリ内の特定の場所への参照です。だから 'Person a = new Person()、b = a;'では、aとbの両方がメモリ上の同じ場所を指しているので、人物aの変更はbに反映され、その逆も同様です。 –

3

app.setName( "newName")は、新しい文字列 "newName"を作成してStringプールに格納し、app内のStringポインタを新しいStringを指すように置き換えます。 "name"文字列はまだ存在します。

覚えておくべき重要なことは、Java文字列オブジェクトは決してに変更されます。新しい文字列を作成するか、古い文字列を変更すると、常に新しいオブジェクトが作成されます。また、Stringはオブジェクトなので、String変数は常に他の場所に格納されているStringへの参照を格納します(他の変数を持つヒープ内、またはString定数プール内に格納されています)。

関連する問題