字符串 - 它们如何在Java中工作?另外,不变性意味着什么?

时间:2014-10-14 17:59:32

标签: java

字符串是不可变的。 看到这段代码。

String a="ninja";

String b= "ninja";

String c=a+" name ";

在此a和b中指向同一个对象。 c将是另一个对象。 当两个字符串指向同一个对象时,它将如何变为不可变? 假设我修改了另一个字符串,如, a =“ninjaturtle”

然后它会指向堆中的另一个地方。所以任何人都可以详细解释,当我们可以修改那个对象时你怎么能说它是不可变的?

4 个答案:

答案 0 :(得分:4)

String是不可变的,你无法改变它。分配a = "ninjaturtle"只会使a指向另一个字符串,它不会更改指向的字符串b

答案 1 :(得分:1)

你混淆了两件事 1)引用变量 - 它类似于指针(不是真的,你不能真正做指针操作) 2)对象 - 引用指向

的变量的实际对象

String Object是一种Object类型,一旦创建它就永远不能更改它。这就是为什么它一成不变。 相反,如果您正在考虑StringBuilder对象,则可以更改其值。因此它是一个可变的对象。

答案 2 :(得分:1)

按照你的例子:

字符串a =" ninja&#34 ;;

a)当遇到上面的语句时,JVM会查看一个字符串对象是否具有值" ninja"已存在于字符串字符串池中,如果没有,则它会创建一个新的字符串对象并将其存储在字符串池中。

请注意:这里' a'是指向值为" ninja"

的String对象的指针

字符串b =" ninja&#34 ;;

b)当再次遇到此语句时,JVM遵循与上面相同的过程,因此查看字符串池中是否存在某个对象,其值为" ninja"。我们知道,我们已经在步骤a)中创建了这样一个对象。现在,编译器不会创建一个新对象,但它会指向' b'到具有值" ninja"

的同一个对象

字符串c = a +"名称&#34 ;;

c)此声明再次遵循上述相同的步骤,并创建一个值为" ninja name"

的新对象

在上面三个语句之后我们在String pool中有以下内容:

a --------------------------> new String(" ninja");

b ------------------------------ ^

c --------------------------> new String(" ninja name");

为了给出答案,让我们尝试修改' a'。

a =" ninja name&#34 ;;

d)现在,编译器将首先检查字符串池,因为和对象的值为" ninja name"已存在指针' a'现在将指向新的字符串(" ninja名称")'

因此,字符串池现在具有以下字符串池:

b --------------------------> new String(" ninja");

c --------------------------> new String(" ninja name");

a --------------------------------- ^

如果您注意到字符串池中的字符串对象仍然相同。当我们尝试修改它们时,它们只指向池中的一些其他String对象或者创建了一个新的String,但是从未修改过现有的String。 这是String的不变性

答案 3 :(得分:0)

immutable表示无法更改物理字符串。这意味着虽然我可以更改字符串指向的位置,但我无法以任何方式更改字符串。

这就是你做

之类的事情的原因
String a = "    hello world";
a.trim();
System.out.println(a); //Prints out:    hello world

在" hello world"之前仍然会有4个空格。

您必须重新分配该位置,如下所示:

String a = "    hello world";
a = a.trim();
System.out.println(a); //Prints out:hello world

字符串不会改变,内存位置会发生变化。