运算符在Java中重载

Oz *_*aim 11 java

根据我在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和Stringasconcatenation.这由语言定义,开发人员无法修改.

但是,您的示例不会在任何地方使用运算符重载.==引用类型总是做同样的事情:true当左侧和右侧引用完全相同的对象时返回.

在这种情况下s1,s2引用相同的对象i1i2引用相同的对象.

  • s1s2引用相同的实习String,因为保证字符串文字被实习.
  • i1i2引用相同的缓存,Integer因为自动装箱将重复使用固定的Integer对象池来获取常见的数值.


duf*_*ymo 5

不会过载运算符,但这并不意味着它不是内置于JVM本身.明显的反例是plus运算符和String和数字的不同行为.