Java 在这种情况下,字符串对象是如何不可变的?

Java 在这种情况下,字符串对象是如何不可变的?,java,Java,我同意字符串对象是不可变的,这意味着它们不能被修改。就像下面的例子一样 String str = "Hi"; String str1 = str.concat("Nilesh"); 这里,如果长度参数为0,将返回str对象,或者将创建一个新的String对象并返回其引用。 如果我这样做了 String str = "Hi"; str="Hello"; 它是如何改变的?不可变从何而来?请举个例子。“Hello”与字符串的对象完全不同,因此您不能再引用“Hi” 不变性不是关于引用,而是关于对象状

我同意字符串对象是不可变的,这意味着它们不能被修改。就像下面的例子一样

String str = "Hi";
String str1 = str.concat("Nilesh");
这里,如果长度参数为0,将返回str对象,或者将创建一个新的String对象并返回其引用。 如果我这样做了

String str = "Hi";
str="Hello";
它是如何改变的?不可变从何而来?请举个例子。

“Hello”
字符串的对象完全不同,因此您不能再引用
“Hi”

不变性不是关于引用,而是关于对象状态。如果状态更改,将创建新对象

如果对象的状态在构造后无法更改,则认为该对象是不可变的

“Hello”
字符串的对象完全不同,因此您不能再引用
“Hi”

不变性不是关于引用,而是关于对象状态。如果状态更改,将创建新对象

如果对象的状态在构造后无法更改,则认为该对象是不可变的


您将不变性与更改引用相混淆

此代码:

String str = "Hi"; // str now refers to the String "Hi"
str = "Hello";  // str now refers to the String "Hello"
只需更改
str
引用的
String
对象
str
是一个变量,它包含对
String
对象的引用。无论是
“Hi”
还是
“Hello”
对象都没有发生任何变化


如果字符串是可变的,它将有一个类似于
setValue(String s)
的方法,可以调用该方法来更改其状态,因此您可以执行以下操作:

String str = "Hi";
str.setValue("Hello"); // if String were mutable

您将不变性与更改引用相混淆

此代码:

String str = "Hi"; // str now refers to the String "Hi"
str = "Hello";  // str now refers to the String "Hello"
只需更改
str
引用的
String
对象
str
是一个变量,它包含对
String
对象的引用。无论是
“Hi”
还是
“Hello”
对象都没有发生任何变化


如果字符串是可变的,它将有一个类似于
setValue(String s)
的方法,可以调用该方法来更改其状态,因此您可以执行以下操作:

String str = "Hi";
str.setValue("Hello"); // if String were mutable

不可变的是字符串本身,而不是指向该字符串的引用。在第二个代码中:

String str = "hi";
str = "hello";
涉及到两个字符串对象:
“hi”
“hello”


str
是一个引用,最初指向第一个引用,然后指向赋值后的第二个引用。但是字符串对象在该代码中不会被修改。

不可变的是字符串本身,而不是指向字符串的引用。在第二个代码中:

String str = "hi";
str = "hello";
涉及到两个字符串对象:
“hi”
“hello”


str
是一个引用,最初指向第一个引用,然后指向赋值后的第二个引用。但是字符串对象
“hi”
不会在该代码中被修改。

str
是一个变量。术语“变量”意味着可以为变量分配各种字符串,一次分配一个字符串。每个字符串仍然是不可变的。

str
是一个变量。术语“变量”意味着可以为变量分配各种字符串,一次分配一个字符串。每个字符串仍然是不可变的。

案例1:

String str = "Hi";
String str1 = str.concat("Nilesh");
总共创建了3个字符串对象

案例2:

String str = "Hi";
str="Hello";
在这种情况下,将创建2个字符串对象。 当执行第1行时,str引用“Hi”。 当执行第2行时,str表示“Hello”并隔离“Hi”。 str只在第2行后面提到“Hello”

案例1:

String str = "Hi";
String str1 = str.concat("Nilesh");
总共创建了3个字符串对象

案例2:

String str = "Hi";
str="Hello";
在这种情况下,将创建2个字符串对象。 当执行第1行时,str引用“Hi”。 当执行第2行时,str表示“Hello”并隔离“Hi”。 如果其他人说“Hello”
是另一个
字符串,str只在第2行之后引用“Hello”。我想你可以看到一个事实,那就是当使用时,一个新的
字符串是最好的。试一试:

String str = "Hi";
System.out.println("try 1: "+System.identityHashCode(str));
str="Hello";
System.out.println("try 2: "+System.identityHashCode(str));
System.identityHashCode
通常会返回引用本身(但您不能依赖该事实)。

如果其他人说
“Hello”
是另一个
字符串。我想你可以看到一个事实,那就是当使用时,一个新的
字符串是最好的。试一试:

String str = "Hi";
System.out.println("try 1: "+System.identityHashCode(str));
str="Hello";
System.out.println("try 2: "+System.identityHashCode(str));
System.identityHashCode
通常会返回引用本身(但您不能依赖该事实)

字符串是不可变的,因此无法修改字符串对象

在这里,将创建两个对象,我们可以通过hashcode进行验证

String str=“Hi”

System.out.println(“Str(Hi)-hashcode:+Str.hashcode())

在这两种情况下,HashCode值将不同

第一个案例->Str(Hi)-哈希代码:2337

第二个案例->Str(你好)-哈希代码:69609650

字符串是不可变的,因此无法修改字符串对象

在这里,将创建两个对象,我们可以通过hashcode进行验证

String str=“Hi”

System.out.println(“Str(Hi)-hashcode:+Str.hashcode())

在这两种情况下,HashCode值将不同

第一个案例->Str(Hi)-哈希代码:2337

第二个案例->Str(你好)-哈希代码:69609650


一个常见的误解是
String str
意味着
str
String
对象。相反,它意味着
str
是对
String
对象的引用。因此,您可以更改引用而不更改引用的对象。一个常见的误解是
String str
表示
str
String
对象。相反,它意味着
str
是对
String
对象的引用。因此,您可以在不更改引用对象的情况下更改引用。那么StringBuffer在图片中的表现如何?@BundleContext。。什么意思?StringBuffer(顺便说一下,除了非常特定的用例之外,它已经过时)是一个完全不同的类