Java中的运算符重载

Java中的运算符重载,java,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); 参考类型比较参考=用于基本类型比较值。在第一个示例中,由于一个称为字符串池的概念,两个

根据我在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);

参考类型比较参考<代码>=用于基本类型比较值。在第一个示例中,由于一个称为字符串池的概念,两个对象引用结果是相同的。因此,在给定情况下有两个
true
。您可能要尝试的另一个代码段:

String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
你一定已经试过了;它先打印出
false
,然后打印出
true
。原因是使用
new
关键字会导致创建一个全新的字符串,即使字符串池中已经存在内容完全相同的字符串对象。在本例中,
s1
现在指向一个包含内容“abc”的内部字符串(或字符串池中的字符串),而
s2
现在指向一个全新的字符串对象(同样包含内容“abc”)。因此,第一个print语句中的
false

在第二个print语句中,我们所做的是比较String对象的内容,而不是它的引用,它应该打印
true

这是Java语言初学者最常见的错误之一;它们使用
==
进行逻辑比较,而实际结果是参考比较。阅读其中一个答案中的链接,了解有关字符串池的更多详细信息。另一方面,String类“重写”了
对象的
equals
方法,以提供逻辑比较。除非您编写的类没有提供
equals
方法的逻辑实现,否则无论您是调用
equals
还是使用
=
操作符都无关紧要;结果将是相同的,即参考比较

要更深入地了解等式,Java中没有运算符重载并不完全正确。没有任何自定义的操作符重载。例如,在
+
中有一些运算符重载,它既作为加法也作为
字符串
-连接进行添加。这是由语言定义的,开发人员无法修改

但是,您的示例没有在任何地方使用运算符重载<代码>=
在引用类型上总是执行相同的操作:当左侧和右侧引用完全相同的对象时,返回
true

在这种情况下,
s1
s2
引用相同的对象,
i1
i2
也引用相同的对象

  • s1
    s2
    引用同一个插入的
    字符串
    ,因为字符串文本保证被插入
  • i1
    i2
    引用同一个缓存的
    Integer
    ,因为自动装箱将重复使用固定的
    Integer
    对象池来获取常用数值
    • 您不能重载操作符,但这并不意味着它没有内置到JVM本身中。一个明显的反例是加号运算符以及字符串和数字的不同行为。

      这是因为“所有文字字符串和字符串值常量表达式都是插入的。”


      请参见

      您的代码显示它与运算符重载有关,但与运算符重载无关

      字符串“==”运算符似乎与整数“==”运算符“重叠”。正如@Sanjay T.Sharma在前面的回答中提到的,在Java中有“reference”类型和“primitive”类型,它们处理不同的“==”操作符


      Java中的字符串是“引用”类型,整数是“基本”类型。如果您在其他语言中使用了指针和对象,您会发现在Java中,字符串变量实际上是指向对象的指针,并且使用“==”运算符的行为不同。

      它打印:false和than true。“新”在这里做了什么?@Oz,请查看我的更新答案以了解更多详细信息,如果您还有问题,请回访。