我给一个字符串变量一个值(作为变量)。
问题是当我改变这个值时,它不会改变另一个变量:
代码 :
String test = "hello";
String myname = test;
test = "how are you ?";
我的名字的输出是“你好”
我希望输出是“你好吗?” 新的测试值;如何在不再次给出值的情况下做到这一点,例如:
myname = test;
我不想再次给出值,因为我的代码中有很多变量将测试变量作为值,我想做最短的方法。
首先,您将值“hello”(在内存中的某个位置)分配给test
:
test --------------> "hello"
然后,您将设置myname
到内存中的相同位置。
test --------------> "hello"
/
myname ----------/
然后,您正在分配值“你好吗?” 在内存中的新test
位置:
-> "hello"
/
myname ----------/
test --------------> "how are you?"
这都是关于指针的。
评论后编辑
我不知道您的其余代码是什么样的,但是如果您希望能够更新单个 String 并同时更新对该 String 的其余引用,那么您需要使用 a 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
以引用String
具有 value 的常量对象"hello"
。
String myname = test;
现在,引用myname
指向的是同一个String
对象test
。
test = "how are you ?";
现在test
指的是一个值为 的新 String
对象"how are you ?"
。myname
请注意,正如您所见,这不会改变。
问题是它String
是不可变的,所以"how are you ?"
是一个新对象。因而myname
仍指旧物"hello"
。
解决方案 1:不要使用两个引用。test
如果只有一个对象,为什么不在整个代码中使用呢?
解决方案 2:让两个引用指向同一个对象,但使用可变对象。例如使用StringBuilder
orStringBuffer
代替String
.
这就是变量的工作方式。变量不是对其他变量的引用。它们是对对象的引用。如果您更改一个变量引用的内容,它不会更改其他变量引用的内容。
您可以更改对象的内容:
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 ?"
您的每个变量都只是指向真实对象的指针。所以在第 2 行之后,两个变量都指向同一个字符串。在第 3 行之后,test
指向其他地方,myname
仍然指向字符串。
Java 字符串一旦创建就无法修改。
为了得到你想要的,你可以使用AtomicReference<String>
你的变量作为数据类型。您实际上并不需要Atomic
引用的部分,但它是 Java 中内置的最简单的引用类型。