字符串是不可变的。 看到这段代码。
String a="ninja";
String b= "ninja";
String c=a+" name ";
在此a和b中指向同一个对象。 c将是另一个对象。 当两个字符串指向同一个对象时,它将如何变为不可变? 假设我修改了另一个字符串,如, a =“ninjaturtle”
然后它会指向堆中的另一个地方。所以任何人都可以详细解释,当我们可以修改那个对象时你怎么能说它是不可变的?
答案 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
字符串不会改变,内存位置会发生变化。