Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串在Java中何时是不同的对象?_Java_String_Memory Management_String Comparison - Fatal编程技术网

字符串在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引用相同的内存对象?这是如

我最近了解到,在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引用相同的内存对象?这是如何工作的?

字符串一旦创建,就会被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。任何字符串对象都可以添加到字符串中