用java和字符串变量指针

时间:2013-10-30 22:45:38

标签: java string

我给String变量赋了一个值(作为变量)。

问题在于,当我更改此值时,它不会更改其他变量:

代码:

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

myname 的输出是“hello”

我希望输出为“你好吗?”新的测试价值;怎么做而不再像以下那样给出价值:

myname = test;

我不想再给出这个值,因为我的代码我得到了很多变量,它们将 test 变量作为值,我想做最短的路。

5 个答案:

答案 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:让两个引用指向同一个对象,但使用一个可变对象。例如使用StringBuilderStringBuffer代替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中内置的最简单的引用类型。