java - 为什么类名与使用 "=="进行的实习字符串比较相矛盾?

标签 java classname string-interning

class helloworld
{
   public static void main(String args[]) {
       String str1="hello";
       String str2="world";
       String str=str1+str2;
       str.intern();
       System.out.println(str=="helloworld");
   }
}  

o/p:假

执行程序后,它会生成 false 作为输出。如果使用 equals() 而不是 "==",则返回 true。为什么会这样?

2.在这种情况下,更改类名后,它会生成 true 作为输出。

class main
{
   public static void main(String args[]) {
       String str1="hello";
       String str2="world";
       String str=str1+str2;
       str.intern();
       System.out.println(str=="helloworld");
  }
} 

o/p:true

为什么使用 "==" 与类名进行黑白中间字符串比较时会出现矛盾(如果比较字符串名称用作类名)?

最佳答案

原因是在第一个示例中,字符串“helloworld”已经在字符串池中,因为它是类的名称。所以实习它不会向字符串池添加任何内容。因此 str 不会是中间值,并且比较将为 false。

在第二个示例中,str.intern() 实际上将 str 添加到字符串池中,因为 "helloworld" 尚不存在。然后,当遇到 "helloworld" 文字时,实际使用的字符串对象是字符串池中的字符串对象。这只是 str,因此比较结果为真。

关于java - 为什么类名与使用 "=="进行的实习字符串比较相矛盾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19653165/

相关文章:

java - getMapPostition 返回空值

c# - 杂项功能静态类的理想类名

c# - 我应该如何处理反序列化的字符串实习?

java - 运行时字符串是否被实习?

java - 找不到主类运行jar

java - 使用移位操作将 Java 中的代码点转换为 utf-8 字节数组

java - 如何使用 Netbeans 8 分析器找出 Java 应用程序中线程仍在运行的位置?

javascript - 动态添加具有特定类名称的表单元格

javascript - 如何从前一个元素的 NodeList 中获取所有类名?

c# - serializer.Deserialize<T>() 上的字符串实习生