字符串在Java中何时是不同的对象?
我最近了解到,在Java中:==比较对象引用,而不是内容,这就是为什么:字符串在Java中何时是不同的对象?,java,string,memory-management,string-comparison,Java,String,Memory Management,String Comparison,我最近了解到,在Java中:==比较对象引用,而不是内容,这就是为什么: String str1 = "hell"; String str2 = "o"; String str3 = str1 + str2; String str4 = "hello"; str3 == str4; // False 到目前为止还不错。但是,当我执行以下操作时: String str5 = "hello"; str5 == str4; // True 这是否意味着str5和str4引用相同的内存对象?这是如
String str1 = "hell";
String str2 = "o";
String str3 = str1 + str2;
String str4 = "hello";
str3 == str4; // False
到目前为止还不错。但是,当我执行以下操作时:
String str5 = "hello";
str5 == str4; // True
这是否意味着str5和str4引用相同的内存对象?这是如何工作的?字符串一旦创建,就会被JVM汇集,这就是为什么这些变量引用字符串池中的同一实例
拥有字符串池的想法是避免不必要的对象创建。一旦创建字符串,JVM就会对其进行池化,这就是为什么这些变量引用字符串池中的同一实例
拥有字符串池的想法是避免不必要的对象创建。字符串是不可变的对象。这就是为什么
str1
和str2
组合不等于str3
字符串是不可变的对象。这就是为什么str1
和str2
组合不等于str3
字符串str5=“hello”创建一个集合字符串值hello
,这就是为什么str5==str4
返回true
另一方面,str1+str2
的工作原理如下:
- 创建类的实例(在幕后)
运算符实际调用该方法+
- 追加完成后,将调用一个方法,该方法返回一个全新的String对象。这就是为什么
实际上是str3==str4
false
- 字符串str5=“hello”创建一个集合字符串值
hello
,这就是为什么str5==str4
返回true
另一方面,str1+str2
的工作原理如下:
- 创建类的实例(在幕后)
运算符实际调用该方法+
- 追加完成后,将调用一个方法,该方法返回一个全新的String对象。这就是为什么
实际上是str3==str4
false
是的
str5
和str4
引用相同的内存对象。当您更改某个字符串的值时,字符串是不可变的,因此它会生成不同的对象。如果两个String
对象具有相同的值,则不会创建第二个对象,JVM只提供第一个对象的引用
当字符串的值更改时,为某些安全和其他有用目的创建的不同对象读取以下链接:
当创建一些字符串时,如
String str1="hello";
当您再次尝试创建具有相同值的字符串时,JVM会创建一个不可变对象
String str2="hello"
JVM使用与创建对象相同的过程来创建一个对象,如果该对象已经创建,则返回str1的对象,以减少重复对象的创建。
这将非常有用是
str5
和str4
引用相同的内存对象。当您更改某个字符串的值时,字符串是不可变的,因此它会生成不同的对象。如果两个String
对象具有相同的值,则不会创建第二个对象,JVM只提供第一个对象的引用
当字符串的值更改时,为某些安全和其他有用目的创建的不同对象读取以下链接:
当创建一些字符串时,如
String str1="hello";
当您再次尝试创建具有相同值的字符串时,JVM会创建一个不可变对象
String str2="hello"
JVM使用与创建对象相同的过程来创建一个对象,如果该对象已经创建,则返回str1的对象,以减少重复对象的创建。
当您创建并分配字符串值时,这将非常有用,例如
String s1=“hello”代码>,它被添加到字符串池中。现在,如果将相同的字符串值分配给另一个引用,如下所示:-
String s2="hello";
String s3= new String("hello");
变量s2将指向字符串池中存在的同一字符串对象hello
但是,您可以强制并为相同的值创建一个新的字符串对象,如下所示:-
String s2="hello";
String s3= new String("hello");
这将为hello
添加并创建新对象,即使该对象已存在于字符串池中
因此,可以概括为:-
s1==s2; //return true
s1==s3; //return false
s2==s3; //returns false
是,当您创建并分配字符串值时,例如String s1=“hello”代码>,它被添加到字符串池中。现在,如果将相同的字符串值分配给另一个引用,如下所示:-
String s2="hello";
String s3= new String("hello");
变量s2将指向字符串池中存在的同一字符串对象hello
但是,您可以强制并为相同的值创建一个新的字符串对象,如下所示:-
String s2="hello";
String s3= new String("hello");
这将为hello
添加并创建新对象,即使该对象已存在于字符串池中
因此,可以概括为:-
s1==s2; //return true
s1==s3; //return false
s2==s3; //returns false
是的,它给出了str5==str4的真实值,因为它使用“字符串池区域”来存储
比较对象引用”,但这些字符串具有与字符串池区域具有一个对象id相同的对象引用。
在第一种情况下,字符串不会在字符串池区域中创建,这就是为什么它会给出false Ya,它为str5==str4提供了真值,因为它使用“字符串池区域”来存储
比较对象引用”,但这些字符串具有与字符串池区域具有一个对象id相同的对象引用。
在第一种情况下,字符串不会在字符串池区域中创建,这就是为什么它会给出false 字符串文本的私有池由string类维护。在程序启动期间,所有文字字符串和字符串值常量表达式都会添加到此池中。所以所有具有相同值的字符串文字都将指向相同的对象
创建新字符串对象时(例如,通过连接两个字符串对象),该对象不属于字符串池,因此将其与另一个字符串文本进行比较将返回false。任何字符串对象都可以添加到字符串中