Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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)时执行Is字符串池_Java_String_Oop_Pool - Fatal编程技术网

当两个字符串具有相同的文本(java)时执行Is字符串池

当两个字符串具有相同的文本(java)时执行Is字符串池,java,string,oop,pool,Java,String,Oop,Pool,我参考了以下链接 还有一些疑问,请帮助我 `public class StrPool { public static void main(String[] args) { String abc="hello"; String abcd="hello"; System.out.println

我参考了以下链接

还有一些疑问,请帮助我

            `public class StrPool
             { 
               public static void main(String[] args)
               { 
                String abc="hello";
                String abcd="hello";
                System.out.println(abc==abcd);
               }
             }
             `
在上面的示例中,OP:true

所以我们可以确认这两个对象都是从同一个字符串对象引用的,我很清楚这一点

    `String abc="hello World";
     String abcd="hello";
     System.out.println(abc==abcd);`
这将给出输出:false

所以字符串池是在两个字符串对象具有相同的文本时执行的

如果是这样,将在字符串池中创建两个字符串对象

为什么第二次输出为假

我读到字符串类是不可变的

abc和abcd有不同的对象引用,然后是不可变的

JVM将创建第一个字符串对象,并给出两个对abc和abcd的引用,对吗

非常感谢……。

第二个输出为false,因为字符串abc和abcd具有不同的contenttext

是的,正如您所说的字符串类是不可变的,即它们的内容不会更改,如果您更改字符串文本,JVM将分配一个新的空间,而不是更改它

现在,当您使用一些文本创建一个新的字符串引用时,JVM将检查该文本是否已经存在于池中,然后将您的字符串引用到该文本,或者在池中创建新文本,第二个输出为false,因为字符串abc和abcd具有不同的contenttext

是的,正如您所说的字符串类是不可变的,即它们的内容不会更改,如果您更改字符串文本,JVM将分配一个新的空间,而不是更改它

现在,当您使用一些文本创建一个新的字符串引用时,JVM将检查该文本是否已经存在于池中,然后将您的字符串引用到该文本,或者在池中创建新文本,请考虑第一个代码

在执行语句字符串abc=hello时,JVM将执行以下操作 1.创建字符串类型的引用abc。 2.检查字符串池中是否有文字hello 如果可用,将其参考值分配给abc, 否则它将创建字符串文字hello,将其引用分配给abc并将其添加到字符串池

对于字符串abcd=hello,将重复相同的步骤。在这里,由于“hello”已在字符串池中可用,因此abcd将引用相同的内容

在第二个代码块中也将遵循这些相同的步骤,事实上,每次使用这样的语句创建string对象时,只会以不同的方式创建文字hello world和hello,并将其分配给各自的变量

我猜,现在您可以猜出上面两个代码示例输出背后的原因了

字符串是不可变的,这意味着您不能更改任何字符串对象。相反,JVM将创建新的字符串对象或从字符串池中提取一个对象并将其分配给引用。 e、 g

在第1行,JVM将在字符串池中创建字符串对象hello,并将其引用分配给varA。 在第2行,JVM将把字符串池中已经存在的hello对象的引用分配给varB。 在第3行,JVM将创建一个新的对象世界,并将其引用分配给varA。现在字符串池将有两个对象,hello和world。 在第4行,JVM将把字符串池中已经存在的世界对象的引用分配给varB。字符串池仍然有两个对象,hello和world

所以基本上,JVM没有修改任何字符串对象,它只是修改了引用

希望对你有帮助。如果您有任何问题,请发表意见。

考虑第一个代码

在执行语句字符串abc=hello时,JVM将执行以下操作 1.创建字符串类型的引用abc。 2.检查字符串池中是否有文字hello 如果可用,将其参考值分配给abc, 否则它将创建字符串文字hello,将其引用分配给abc并将其添加到字符串池

对于字符串abcd=hello,将重复相同的步骤。在这里,由于“hello”已在字符串池中可用,因此abcd将引用相同的内容

在第二个代码块中也将遵循这些相同的步骤,事实上,每次使用这样的语句创建string对象时,只会以不同的方式创建文字hello world和hello,并将其分配给各自的变量

我猜,现在您可以猜出上面两个代码示例输出背后的原因了

字符串是不可变的,这意味着您不能更改任何字符串对象。相反,JVM将创建新的字符串对象或从字符串池中提取一个对象并将其分配给引用。 e、 g

在第1行,JVM将在字符串池中创建字符串对象hello,并将其引用分配给varA。 在第2行,JVM将把字符串池中已经存在的hello对象的引用分配给varB。 在第3行,JVM将创建一个新的对象世界,并将其引用分配给varA。现在字符串池将有两个对象,hello和world。 在第4行,JVM将把字符串池中已经存在的世界对象的引用分配给varB。字符串池仍将有两个对象,hello和 世界

所以基本上,JVM没有修改任何字符串对象,它只是修改了引用

希望对你有帮助。如果您有任何问题,请评论

所以字符串池是在两个字符串对象具有相同的文本时执行的

->不完全是这样,字符串池是在定义文字字符串时执行的。如果创建字符串obj=sometext之类的文本字符串对象,并且在创建第二个字符串obj1=sometext之类的文本时,JVM会将obj1内容与sometext进行比较。如果两个内容相等,比如字符串str1=hello和字符串str2=hello,那么对象引用str1和str2将指向同一个objecthello

为什么第二次输出为假

->因为abc和abcd指向不同的字符串对象

不可变意味着:一旦创建对象,您就不能更改其内容

所以字符串池是在两个字符串对象具有相同的文本时执行的

->不完全是这样,字符串池是在定义文字字符串时执行的。如果创建字符串obj=sometext之类的文本字符串对象,并且在创建第二个字符串obj1=sometext之类的文本时,JVM会将obj1内容与sometext进行比较。如果两个内容相等,比如字符串str1=hello和字符串str2=hello,那么对象引用str1和str2将指向同一个objecthello

为什么第二次输出为假

->因为abc和abcd指向不同的字符串对象


不可变意味着:一旦创建了对象,就不能更改其内容。

Java自动应用于双引号文本。因此,可以保证

String foo1 = "foo";
String foo2 = "foo";
assert foo1 == foo2;
但是,对于构造为非文本的字符串,这是不保证的,即给定

String foo1 = "foo";
// contrived example, but imagine foo2 came from reading a file or similar
String foo2 = new String(new char[] { 'f', 'o', 'o' });

可以保证foo1.equalsfoo2,但不一定是foo1==foo2。您可以显式地调用intern—保证foo1==foo2.intern—但是当您关心值相等时,通常使用equals更为清晰,并且仅当您确实需要引用相等时才使用==。

Java自动应用于双引号文本。因此,可以保证

String foo1 = "foo";
String foo2 = "foo";
assert foo1 == foo2;
但是,对于构造为非文本的字符串,这是不保证的,即给定

String foo1 = "foo";
// contrived example, but imagine foo2 came from reading a file or similar
String foo2 = new String(new char[] { 'f', 'o', 'o' });

可以保证foo1.equalsfoo2,但不一定是foo1==foo2。您可以显式调用intern—保证foo1==foo2.intern—但当您关心值相等时,通常更清楚地使用equals,而仅当您确实需要引用相等时才使用==。

因此字符串池机制基于文本。如果两个对象具有不同的文本,Jvm会为每两个对象分配新的空间,如果我给abc=new hello,这个文本会覆盖现有的文本吗。@Amith yes完全正确。。abc=new hello新空间将分配给new hello,并将传递给abcImutable,这意味着它永远不会改变,所以它可以possible@AmithJVM在abc空间内不改变,它分配abc新空间,所以当gc执行之前的abc=hello时;将被删除abc=hello中没有引用;是否有任何方法可以拾取以前的值abc=hello,abc=new helloSo字符串池机制基于文本。如果两个对象具有不同的文本,Jvm会为每两个对象分配新的空间,如果我给abc=new hello,这个文本会覆盖现有的文本吗。@Amith yes完全正确。。abc=new hello新空间将分配给new hello,并将传递给abcImutable,这意味着它永远不会改变,所以它可以possible@AmithJVM在abc空间内不改变,它分配abc新空间,所以当gc执行之前的abc=hello时;将被删除abc=hello中没有引用;如果我更改了abc=new hello,是否有任何方法可以选择以前的值abc=hello,abc=new hello;你能在此基础上解释imutable吗?abc指向的对象有新hello的内容,你不能像将内容更改为旧hello那样更改此内容如果我更改了abc=新hello;你能在此基础上解释imutable吗?abc指向的对象有新hello的内容,你不能像将内容更改为旧hello一样更改此内容