指针与Java和字符串变量
这个问题在这里已经有了答案:
首先你要分配值“hello”(在内存中的某个地方)来test
:
test --------------> "hello"
然后,您将myname
设置为内存中的相同位置。
test --------------> "hello"
/
myname ----------/
然后,你正在分配价值“你好吗?” 在内存中的新位置进行test
:
-> "hello"
/
myname ----------/
test --------------> "how are you?"
这些都是关于指针的。
编辑后评论
我不知道代码的其余部分是什么样的,但是如果你想能够更新一个字符串并且让其他的字符串更新引用同时被更新,那么你需要使用一个StringBuilder
(或者StringBuffer
如果你需要同步),而不是:
StringBuilder test = new StringBuilder("hello");
StringBuilder myname = test;
StringBuilder foo = test;
StringBuilder bar = test;
test.replace(0, test.length(), "how are you?");
Assert.assertEquals("how are you?", test.toString());
Assert.assertEquals("how are you?", myname.toString());
Assert.assertEquals("how are you?", foo.toString());
Assert.assertEquals("how are you?", bar.toString());
从那里得到它?
这听起来像你需要了解引用变量和变量引用的对象之间的区别。 让我们看看你的代码的作用:
String test = "hello";
这将赋值引用变量test
以引用值为"hello"
的常量String
对象。
String myname = test;
现在引用myname
引用与test
相同的String
对象。
test = "how are you ?";
现在, test
引用一个新的 String
对象,其值为"how are you ?"
。 请注意,这不会像您所看到的那样更改myname
。
问题在于String
是不可变的,所以"how are you ?"
是一个新的对象。 因此, myname
仍然指的是旧对象"hello"
。
解决方案1:不要使用两个引用。 如果只有一个对象,为什么不在整个代码中使用test
呢?
解决方案2:让两个引用指向同一个对象,但使用可变对象。 例如使用StringBuilder
或StringBuffer
而不是String
。