当我尝试在 Java 中执行代码时,它给了我 2 个不同的输出
String txt1="Hello";
String txt2="Hello";
System.out.println((boolean)txt1==txt2);
String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println((boolean)txt1==txt2);
当我尝试在 Java 中执行代码时,它给了我 2 个不同的输出
String txt1="Hello";
String txt2="Hello";
System.out.println((boolean)txt1==txt2);
String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println((boolean)txt1==txt2);
字符串是对象。==
比较对象引用,而不是字符串的内容。为此,请使用该String#equals
方法。
在您的第一个示例中,txt1
andtxt2
是指向同一个 String
对象的两个变量。所以他们是==
彼此的。
在您的第二个示例中,txt1
并且txt2
指向两个不同 String
的对象(它们具有相同的字符序列),因此它们彼此不==
相关。
另外:写作几乎没有任何意义new String("string literal")
。如果你不知道一个非常非常好的理由去做这件事,不要这样做。只有几个非常、非常、非常不寻常的情况下你可能会这样做,这与与低级别的东西交互有关。不是在正常的、可移植的 Java 代码中。
有时有使用的理由new String(String)
(不是字符串文字,而是您从其他地方获得的实例,例如substring
)。有关更多信息,请参阅本文(感谢Rp-)。
运算符将==
检查引用是否相等,也就是说,true
如果两个参数String
s 是同一个实例,则返回。
每当一个String
字面量(例如"Hello"
)出现在一个类中时,一个String
实例就会被实习(一种存储在内部缓存中以便可以重用)。
做完之后String txt1="Hello"
,txt1
会是实习生的参考String
。所以,
String txt1="Hello";
String txt2="Hello";
结果是相同的实例txt1
,txt2
即被拘留的实例。
当您执行此操作String txt1=new String("Hello")
时,它会String
以实习实例作为参数调用构造函数(一种复制构造函数)。因此,txt1
将是一个与实习实例具有相同值的新 String
实例,并且==
操作符将返回false
。
有关该主题的更多信息,请参见 3.10.5。JLS 的字符串文字部分。
字符串文字是对 String 类实例的引用(第 4.3.1 节、第 4.3.3 节)。
此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。
以下问题的答案解释了Java 字符串何时被实习?. 以下链接详细说明了该主题:字符串平等和实习。
作为旁注,请记住使用equals()
以便根据其内容执行字符串比较。
在可能的情况下,Java 会尝试将字符串“共享”到安全空间。
String txt1="Hello";
String txt2="Hello";
是对同一个对象的两个引用(“Hello”)
String txt1=new String("Hello");
String txt2=new String("Hello");
是对两个不同实例的两个引用,每个实例都由副本初始化。
如果比较字符串,请始终使用“equals()”,否则结果难以预测。
如果要比较引用,请使用==
运算符。
如果要比较两个字符串的内容,请使用equals
方法。
做这个
String txt1="Hello";
String txt2="Hello";
System.out.println(txt1.hashCode());
System.out.println(txt2.hashCode());
System.out.println((boolean)txt1==txt2);
String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println(txt1.hashCode());
System.out.println(txt2.hashCode());
System.out.println((boolean)txt1==txt2);
您可以了解 java 在内部的处理方式。