Java 字符串引用?
我们制作以下字符串对象Java 字符串引用?,java,string,Java,String,我们制作以下字符串对象 String str1 = new String("ABC"); String str2 = new String("ABC"); String str3 = "ABC"; String str4 = "ABC"; 关于上述两个问题: system.out.println(“valof str1”+str1)--它以ABC格式打印str1 但是当我们比较if(str1==str2)时,它会比较string对象的引用。怎么做 你有什么不同吗 str1与str2和str3具
String str1 = new String("ABC");
String str2 = new String("ABC");
String str3 = "ABC";
String str4 = "ABC";
关于上述两个问题:
system.out.println(“valof str1”+str1)代码>--它以ABC格式打印str1
但是当我们比较if(str1==str2)
时,它会比较string对象的引用。怎么做
你有什么不同吗
str1
与str2
和str3
具有不同的引用,但是str3
和str4
具有相同的引用,所以jvm会检查我们将使用相等运算符(而不是新运算符)创建的字符串是否已经存在(如果存在,它不会创建新对象,只需将相同的引用分配给新变量,即str4
),但在使用新运算符时,它不会进行此验证“ABC”
而不是新字符串(“ABC”)
)被插入。也就是说,JVM中只存储了一个副本,并且始终是使用的副本。这就是为什么使用==
时它们比较相等的原因
以下比较也总是正确的:
str1.intern() == str2.intern()
str1.intern() == str3
str2.intern() == str3
str1.intern() == str4
str2.intern() == str4
当您调用
新字符串(…)
时,您正在显式地创建新字符串并请求不同的引用。如果您想返回到单个引用,可以调用:
str1 = str1.intern();
仅供参考,你可以调用s.intern()来实习任何字符串。@Spike:事实上,我更新了我的答案来证明这一点。(我本来打算在一开始就把它放进去,但因为我想在《西部最快的枪》中获得第一个帖子——我通常会发布一些基本的帖子,然后在5分钟的宽限期内扩展。)感谢chris给出了深刻的解释。但我对您的解释有以下疑问:-1)如果我们创建了str1=新字符串(“ABC”)//它现在还没有添加到池中。正确吗?但是,当我们执行str1.intern()时,它会将str1添加到池中。我的point1仍然没有得到响应,即当我们执行此操作时,如果(str1==str2)它比较引用,但在打印str1 inside sys out时,它实际上会打印值?@Mohit:打印时不需要插入字符串!如果你想用
==
进行比较,只需要实习一下。否则,不管你是否实习一个字符串都没有区别。@berry120祝贺你对最近一个问题投了56票