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(顺便说一下,除了非常特定的用例之外,它已经过时)是一个完全不同的类