我给String变量赋了一个值(作为变量)。
问题在于,当我更改此值时,它不会更改其他变量:
代码:
String test = "hello";
String myname = test;
test = "how are you ?";
myname 的输出是“hello”
我希望输出为“你好吗?”新的测试价值;怎么做而不再像以下那样给出价值:
myname = test;
我不想再给出这个值,因为我的代码我得到了很多变量,它们将 test 变量作为值,我想做最短的路。
答案 0 :(得分:9)
首先,您要将值“hello”(在内存中的某个位置)分配给test
:
test --------------> "hello"
然后,您将myname
设置为内存中相同的位置。
test --------------> "hello"
/
myname ----------/
然后,您将分配值“你好吗?”在内存中的新位置test
:
-> "hello"
/
myname ----------/
test --------------> "how are you?"
这都是关于指针的。
评论后编辑
我不知道你的代码的其余部分是什么样的,但如果你想能够更新单个String并同时拥有对该String更新的其余引用,那么你需要使用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());
从那里得到它?
答案 1 :(得分:3)
听起来你需要了解引用变量和变量引用的对象之间的区别。让我们看看你的代码做了什么:
String test = "hello";
这会指定引用变量test
以引用值为String
的常量"hello"
对象。
String myname = test;
现在引用myname
引用与String
相同的test
对象。
test = "how are you ?";
现在test
是指新 String
对象,其值为"how are you ?"
。请注意,这不会改变myname
,如您所见。
答案 2 :(得分:3)
问题是String
是不可变的,因此"how are you ?"
是一个新对象。因此,myname
仍然引用旧对象"hello"
。
解决方案1:不要使用两个引用。如果只有一个对象,为什么不在代码中使用test
?
解决方案2:让两个引用指向同一个对象,但使用一个可变对象。例如使用StringBuilder
或StringBuffer
代替String
。
答案 3 :(得分:2)
这就是变量的工作原理。变量不是对其他变量的引用。它们是对象的引用。如果更改一个变量引用的内容,则不会更改其他变量引用的内容。
您可以通过以下方式更改对象的内容:
public class Container {
private String value;
// setter and getter omitted
}
Container test = new Container();
test.setValue("hello");
Container myname = test;
test.setValue("how are you ?);
System.out.println(myname.getValue()); // prints "how are you ?"
答案 4 :(得分:2)
每个变量只是一个真实对象的指针。所以在第2行之后,两个变量都指向同一个字符串。在第3行之后,test
指向其他地方,myname
仍然指向该字符串。
创建Java String后无法修改它。
要获得所需内容,可以使用AtomicReference<String>
作为变量的数据类型。您并不真正需要引用的Atomic
部分,但它是Java中内置的最简单的引用类型。