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

字符串-它们在Java中如何工作?还有,不变性意味着什么?,java,Java,字符串是不可变的。 请参阅此代码 String a="ninja"; String b= "ninja"; String c=a+" name "; 在这种情况下,a和b指向同一个对象。c将是另一个对象。 当两个字符串指向同一个对象时,它将如何变得不可变? 假设我用另一个字符串修改a,比如, a=“忍者龟” 然后它将指向堆中的另一个位置。那么,有谁能详细解释一下,当我们可以修改那个对象时,你怎么能说它是不可变的呢?String是不可变的,你不能改变它。分配a=“ninjaturtle”只会

字符串是不可变的。 请参阅此代码

String a="ninja";

String b= "ninja";

String c=a+" name ";
在这种情况下,a和b指向同一个对象。c将是另一个对象。 当两个字符串指向同一个对象时,它将如何变得不可变? 假设我用另一个字符串修改a,比如, a=“忍者龟”


然后它将指向堆中的另一个位置。那么,有谁能详细解释一下,当我们可以修改那个对象时,你怎么能说它是不可变的呢?

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

字符串
是不可变的,您不能更改它。分配
a=“ninjaturtle”
只会使
a
指向另一个字符串,它不会更改
b
指向的字符串。

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

这就是为什么当你做这样的事情时

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

字符串不会更改,内存位置会更改。

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

这就是为什么当你做这样的事情时

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
字符串不会更改,内存位置会更改。

您混淆了两件事 1) 引用变量——它类似于指针(实际上不是,您不能真正执行指针操作) 2) 对象——引用指向的变量的实际对象

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

你把两件事搞混了 1) 引用变量——它类似于指针(实际上不是,您不能真正执行指针操作) 2) 对象——引用指向的变量的实际对象

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

按照您的示例:

字符串a=“忍者”

a) 当遇到上述语句时,JVM会查看字符串池中是否已经存在值为“ninja”的字符串对象,如果没有,则会创建一个新的字符串对象并将其存储在字符串池中

请注意:这里的“a”是指向值为“ninja”的字符串对象的指针

字符串b=“忍者”

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

字符串c=a+“名称”

c) 此语句再次遵循上述相同的过程,并创建一个值为“ninja name”的新对象

在上述三条语句之后,字符串池中有以下内容:

a------------------->新字符串(“忍者”)

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

c------------------->新字符串(“忍者名称”)

为了给出您的答案,让我们尝试修改“a”

a=“忍者姓名”

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

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

b-------------------新字符串(“忍者”)

c------------------->新字符串(“忍者名称”)

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

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

根据您的示例:

字符串a=“忍者”

a) 当遇到上述语句时,JVM会查看字符串池中是否已经存在值为“ninja”的字符串对象,如果没有,则会创建一个新的字符串对象并将其存储在字符串池中

请注意:这里的“a”是指向值为“ninja”的字符串对象的指针

字符串b=“忍者”

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

字符串c=a+“名称”

c) 此语句再次遵循上述相同的过程,并创建一个值为“ninja name”的新对象

在上述三条语句之后,字符串池中有以下内容:

a------------------->新字符串(“忍者”)

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

c------------------->新字符串(“忍者名称”)

为了给出您的答案,让我们尝试修改“a”

a=“忍者姓名”

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

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

新的