不是';Java中的t字符串对象不可变?

不是';Java中的t字符串对象不可变?,java,string,immutability,Java,String,Immutability,这可能吗?我认为在Java中不能更改字符串对象。字符串对象是不可变的。但是,字符串引用是可变的。上面,s是一个引用。这里您创建了一个新字符串,并将其分配给一个预先使用的引用。引用的原始字符串已被垃圾回收。没有实际更改的字符串。字符串对象是不可变的,这意味着s引用的实例的值不能更改 您的代码不会改变实例。 相反,它将s引用更改为引用新的字符串实例 例如: String s = ...; s = s.substring(1); 执行此代码后,b仍然是“1” 行b=a设置b引用与a当前引用的“1”

这可能吗?我认为在Java中不能更改字符串对象。

字符串对象是不可变的。但是,字符串引用是可变的。上面,
s
是一个引用。

这里您创建了一个新字符串,并将其分配给一个预先使用的引用。引用的原始字符串已被垃圾回收。没有实际更改的字符串。

字符串对象是不可变的,这意味着
s
引用的实例的值不能更改

您的代码不会改变实例。
相反,它将
s
引用更改为引用新的字符串实例

例如:

String s = ...;

s = s.substring(1);
执行此代码后,
b
仍然是
“1”

b=a
设置
b
引用与
a
当前引用的
“1”
实例相同的

当您随后编写
a=“2”
时,您正在更改
a
变量以引用不同的(
“2”
)实例。
但是,
b
仍然引用的原始
“1”
实例没有更改。

是的,对象是不可变的

变量
s
是对一个对象的引用,引用本身可以改变它指向的对象——重新指定引用不会影响它指向的对象

该方法实际上是返回
字符串的新实例,因此原始
字符串
对象保持不变

下面是一个简单的示例,说明原始
字符串
不会被
子字符串
方法更改:

String a = "1";
String b = a;
a = "2";
上面的示例将打印“Hello!”,因为
子字符串
方法将返回一个新的
字符串
,而不会影响原始字符串。无法更改原始的
字符串
,因为它是不可变的

将上述内容与以下内容进行比较:

String s = "Hello!";
s.substring(1);

System.out.println(s);   // Prints "Hello!"
在此示例中,对
s
的引用更改为
子字符串
方法返回的
字符串
,因此当与
s
关联的
字符串
由`System.out.println'打印时,输出的字符串将是“ello!”!“

所以:

String s = "Hello!";
s = s.substring(1);

System.out.println(s);   // Prints "ello!"
使用String s=“abc”时,将创建一个字符串引用,该字符串引用具有不可变值“abc”

然后,当您说s=s.substring(1);,则将s指定给新创建的包含“bc”的字符串对象,但原始对象不变

这是导致错误的常见原因,因为如果未指定值,可能会得到意外的结果

许多Java新手会使用类似trim()的方法,但没有意识到trim()不会影响字符串

s、 修剪()测试它:

String foo = "foo";
foo.substring(1);
System.out.println(foo);

//of course..
foo = "aa";
System.out.println(foo);

s
现在是
T
j
仍然是
Test

//创建字符串“Hello”的引用s

String s=“你好”

//现在打印s引用的字符串的子字符串

System.out.println(s.subString(1));

//现在打印s引用的字符串

系统输出打印项次;

上面的代码片段将首先打印H,然后在第二行打印Hello现在为什么它首先打印H?:事情是subString()方法返回一个字符串*而不更改引用s*引用的字符串s仍然引用“Hello”。现在当您尝试打印s时,它将打印s引用的字符串。这样,字符串“Hello”“是不可改变的。您可以使用它生成另一个字符串,但不能对其进行变异。

当use语句s=s.subString(1)时;
您正在做的是,s现在引用的是“Hello”的子字符串(),但“Hello”本身仍然没有被修改。

如果只有
s,您将是正确的。子字符串(1)
将更改
s
中的字符串。但是您正在为
s
分配一个新字符串。您只是更改引用,而不是原始字符串本身。一个次要的风格点——通常最好创建一个新的、以描述性命名的局部变量,而不是像这样重复使用变量。不要混淆对象和引用。对象可以是可变的或不可变的。参考可能是最终的,也可能不是。引用
final
不会使对象不可变。不可变对象可以通过引用来引用,而不必是
final
。Brandon您应该首先了解什么是引用,什么是可变性。+1简短且正确。s的初始值仍然在内存中,没有改变,可能现在没有被引用,等待得到GC'd。然而,引用s现在指向了一个新的、同样不可变的对象,它是由substring方法创建的。Dang,我希望在你给我自己准备一堆简单的rep.:)+1之前看到这个Q
String s = "Test";
String j = s;

s = s.substring(1);