2

我给一个字符串变量一个值(作为变量)。

问题是当我改变这个值时,它不会改变另一个变量:

代码 :

 String test = "hello";
 String myname = test;
 test = "how are you ?";

我的名字的输出是“你好”

我希望输出是“你好吗?” 新的测试值;如何在不再次给出值的情况下做到这一点,例如:

myname = test;

我不想再次给出值,因为我的代码中有很多变量将测试变量作为值,我想做最短的方法。

4

5 回答 5

9

首先,您将值“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());

从那里得到它?

于 2013-10-30T22:53:19.823 回答
3

听起来您需要了解引用变量和变量所引用的对象之间的区别。让我们看看你的代码做了什么:

String test = "hello";

这将分配引用变量test以引用String具有 value 的常量对象"hello"

 String myname = test;

现在,引用myname指向的是同一个String对象test

test = "how are you ?";

现在test指的是一个值为 的 String对象"how are you ?"myname请注意,正如您所见,这不会改变。

于 2013-10-30T22:51:36.290 回答
3

问题是它String是不可变的,所以"how are you ?"是一个新对象。因而myname仍指旧物"hello"

解决方案 1:不要使用两个引用。test如果只有一个对象,为什么不在整个代码中使用呢?

解决方案 2:让两个引用指向同一个对象,但使用可变对象。例如使用StringBuilderorStringBuffer代替String.

于 2013-10-30T22:52:37.867 回答
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 ?"
于 2013-10-30T22:53:27.880 回答
2

您的每个变量都只是指向真实对象的指针。所以在第 2 行之后,两个变量都指向同一个字符串。在第 3 行之后,test指向其他地方,myname仍然指向字符串。

Java 字符串一旦创建就无法修改。

为了得到你想要的,你可以使用AtomicReference<String>你的变量作为数据类型。您实际上并不需要Atomic引用的部分,但它是 Java 中内置的最简单的引用类型。

于 2013-10-30T22:53:41.953 回答