根据我在java中的知识,我知道,Java语言中没有运算符重载.那么,为什么这段代码会两次打印'true'?
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2);
Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1==i2);
Run Code Online (Sandbox Code Playgroud)
San*_*rma 24
==
参考类型比较参考; ==
对于原始类型比较值.在第一个示例的情况下,由于称为字符串池的概念,两个对象引用结果相同.因此true
在给定的情况下有两个.您可能想要尝试的另一个代码段:
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
Run Code Online (Sandbox Code Playgroud)
因为你必须已经尝试过; 它打印出来false
然后true
.这样做的原因是,使用new
关键字会导致创建一个全新的字符串,即使字符串池中已存在具有完全相同内容的字符串对象.在这种情况下,s1
现在指向具有内容"abc"(或字符串池中的字符串)的实习字符串,而s2
现在指向一个全新的字符串对象(同样具有内容"abc").因此false
在第一个印刷声明中.
在第二个print语句中,我们正在做的是比较String对象的内容而不是它的引用,它应该打印true
.
这是Java语言初学者最常犯的错误之一; ==
当它实际导致参考比较时,它们用于逻辑比较.阅读其中一个答案中发布的链接,了解有关字符串池的更多详细信息.在相关的说明中,String类"覆盖"类的equals
方法Object
以提供逻辑比较.除非您编写的类没有提供该equals
方法的逻辑实现,否则无论您是调用equals
还是使用==
运算符都无关紧要; 结果将是相同的,即参考比较.
有关平等的更深入观点,请阅读Brian的文章; 读得很好.
Joa*_*uer 14
Java中没有运算符重载并不完全正确.没有任何自定义运算符重载.例如,有一些运算符重载,+
其中添加了as和String
asconcatenation.这由语言定义,开发人员无法修改.
但是,您的示例不会在任何地方使用运算符重载.==
引用类型总是做同样的事情:true
当左侧和右侧引用完全相同的对象时返回.
在这种情况下s1
,s2
引用相同的对象i1
并i2
引用相同的对象.
s1
并s2
引用相同的实习String
,因为保证字符串文字被实习.i1
并i2
引用相同的缓存,Integer
因为自动装箱将重复使用固定的Integer
对象池来获取常见的数值. 归档时间: |
|
查看次数: |
9561 次 |
最近记录: |