由于Java并没有像C++那样的重载运算符的机制,因此在比较类对象时,Java没有办法像C++那样通过重载==运算符来直接比较两个类对象是否相等,只能使用Object类中的equals()方法来对类对象进行比较,但是equals()方法中有一些地方值得说明。

先上代码:

import java.util.*;
public class Test {public static void main(String[] args) {Integer a1 = new Integer(10);Integer a2 = new Integer(10);System.out.println(a1==a2);System.out.println(a1.equals(a2));}
}

输出结果是:

false

true

这里应该注意到,对于类而言,创建类对象的时候,Java使用引用数据类型来指向真正的对象空间。也就是说,当我创建一个a1时,这个时候a1只是一个Integer类的引用,它储存在栈中,而new Integer(10)这行代码才是真正创建了一个Integer对象,并将这个对象设置为10,这个对象储存在堆中。当使用==运算符对比a1和a2时,结果是false,这是因为==运算符对于类对象来说比较的是引用而不是真正的对象,在栈中,a1这个引用指向的对象空间和a2引用指向的对象空间并不相同(因为a1和a2用了两次new开辟的空间),因此使用==运算符结果自然是false。这个时候要想获得true,就应该使用equals方法,这个方法才是真正到达a1和a2指向的对象空间,对这两个对象进行比较,从而得到true。

接下来,针对Integer数组来对==和equals进行说明:

public class Test {public static void main(String[] args) {Integer[] a3 = new Integer[] {new Integer(1), new Integer(2), new Integer(3)};Integer[] a4 = new Integer[] {new Integer(1), new Integer(2), new Integer(3)};System.out.println(a3==a4);System.out.println(a3.equals(a4));}
}

这里创建的是Integer数组,输出结果为:

false
false
本来第二个输出应该得到true,但是事实却相反。原因在于,创建数组时,数组名本身为引用,数组内的元素也是引用,拿a3来说,创建a3时,Java注意到它有1,2,3这三个元素,因此它在栈中创建一个引用,这个引用名字是a3,这个引用指向一个含有三个引用的集合,也就是一个数组,这个集合的元素名分别是a3[0],a3[1],a3[2],请注意,这三个元素都是引用,每个元素指向堆中的一个对象空间,那个空间存储的才是真正的数据。因此对a3和a4使用equals进行比较的时候仍然无法直接比较真正的对象。要想得到true,要使用另一个方法,即Arrays.equals()方法(这个方法位于util包中,在使用这个方法之前,应该添加import java.util.*;这行代码以导入这个包),这个方法不同于对象本身的方法,它接受两个数组参数,对它们进行比较。

System.out.println(Arrays.equals(a3, a4));

这行的输出结果是true,当然,也可以对数组内的元素(引用)依次进行比较:

System.out.println(a3[0].equals(a4[0]));

这样也可以得到true,这也从侧面证明了数组a3和a4内的元素,原来只不过都是引用罢了。

请注意,前面创建a3和a4,里面的元素都是使用new Integer(参数)来创建的,但是Java对基本数据类型和类对象之间一个自动包装机制,如果代码这么写:

public class Test {public static void main(String[] args) {Integer[] a5 = new Integer[] {1, 2, 3};Integer[] a6 = new Integer[] {1, 2, 3};System.out.println(a5==a6);System.out.println(a5.equals(a6));System.out.println(a5[1]==a6[1]);System.out.println(a5[1].equals(a6[1]));}
}

这里的输出是:

false
false
true
true

这个输出是令我疑惑的地方,由于自动包装机制的存在,a5的元素可以直接用整数来填充,这样一来,我知道a5是一个引用,但我无法得知a5内的元素是否是引用,如果是引用,那么第三行输出,即a5[1]==a6[1]应该得到false,如果不是引用,那么第二行输出,即a5.equals(a6)应该得到true,这个自动包装机制让我很是无法理解这里的输出,如果您看到了这里,并且知道其中玄机的话,恳请您告诉我其中的原因。

现在,我们来抛开Java自带的类,来对我们自定义的类使用equals()方法,看看会是什么样子:

class A {private int a;public A(int a) {this.a = a;}
}
public class Test {public static void main(String[] args) {A a7 = new A(10);A a8 = new A(10);System.out.println(a7==a8);System.out.println(a7.equals(a8));}
}

在这里我定义了一个简单的类A,它含有一个私有的int数据,并且通过构造器来对这个私有int进行赋值。

这里的输出结果是:

false
false
这里有一点,为什么前面对a1和a2(两者都是Integer引用)使用equals()就可以得出true,而这里却无法得出true?原因在于,位于根类Object的equals()方法在比较时默认比较的仍然是引用,在类A中,我没有对继承自Object的equals()方法进行覆盖,因此对A对象调用equals()方法时比较的仍然是引用(相当于使用了==运算符),而Integer能得出true的原因就是Java自带的包装类都覆盖了equals方法,从而能得出正确结果,对于类A来说,使equals方法进行正确行为的解决方法就是覆盖equals方法,因此可以在类A中添加方法equals():

 public boolean equals(A a) {if (this.a == a.a) return true;return false;}

添加了equals方法后的类A可以就可以得出正确的比较结果。

Java关于equals()方法和“==”逻辑运算符的区别简介相关推荐

  1. Java中equals方法和==有什么区别

    我们先上结论喽: ==要求比较严格,要求两个对象必须是同一个对象: equals方法,判断完了是否是同一个对象,会继续判断两个对象的值是否相同,他的要求没那么严格,只要值相同,就好了. 文章目录 1. ...

  2. Java培训教程:”==“和 equals 方法究竟有什么区别?

    在学习java技术过程中,我们会接触到一些变量值的相关知识,本期小编为大家介绍的教程就是关于"=="和 equals 方法究竟有什么区别?来看看下面的详细介绍. Java培训教程: ...

  3. java 双等号(==) 与equals方法的介绍和区别

    java 双等号(==) 与equals方法的介绍和区别 1.基本数据类型与equals方法 == 用于比较基本数据类型时,比较的是值 ==用于比较引用数据类型时,比较的是地址 equals方法在Ob ...

  4. Java中equals()方法和==的区别分析

    Java中equals方法和==的区别分析 equals(Object obj)方法,将对象与传入的obj进行比较,相等返回true,否则返回false.equals方法和"==" ...

  5. java的equals方法_Java Date equals()方法与示例

    java的equals方法 日期类equals()方法 (Date Class equals() method) equals() method is available in java.util p ...

  6. java的equals方法_Java LocalDateTime类| 带示例的equals()方法

    java的equals方法 LocalDateTime类equals()方法 (LocalDateTime Class equals() method) equals() method is avai ...

  7. java的equals方法_Java Vector equals()方法与示例

    java的equals方法 向量类的equals()方法 (Vector Class equals() method) equals() method is available in java.uti ...

  8. java的equals方法_Java Duration类| 带示例的equals()方法

    java的equals方法 持续时间类equals()方法 (Duration Class equals() method) equals() method is available in java. ...

  9. Java Double equals()方法具有什么功能呢?

    转自: Java Double equals()方法具有什么功能呢? 下文笔者将讲述equals()方法的功能简介说明,如下所示: equals()方法的功能 java.lang.Double.equ ...

最新文章

  1. Cesium 中两种添加 model 方法的区别
  2. InfoVista.NET 内部数据格式简介
  3. __declspec(selectany)的作用
  4. JSP中动态添加 “添加附件选择框”
  5. 计算机二级考试题停车收费,计算机二级考试真题-Excel-停车场调整收费标准
  6. (软件工程复习核心重点)第十二章软件项目管理-第一节:软件项目管理综述、估算软件规模和工作量估算
  7. python pipeline框架_爬虫(十六):Scrapy框架(三) Spider Middleware、Item Pipeline|python基础教程|python入门|python教程...
  8. 224除以10为什么等于22c语言,C语言程序设计(专)-作业二武汉理工大学20春
  9. ai画面怎么调大小_AI人脸抓拍摄像机安装指导,这样安装抓拍更准
  10. EfficientNet理论讲解
  11. 2022年电梯考试电梯检验员练习题及答案
  12. java 排班日历_快速简化排班(智能排班)-日历排班
  13. 【Win32多线程】异步I/O技术(Overlapped I/O),避免使用多线程
  14. (点击||敲击)发出声音特效「HTML+CSS+JavaScript」项目总结
  15. Spring5 框架
  16. 广和通l610二次开发|广和通l610 CAT.1模组opencpu开发《二》cola_os移植
  17. 欢乐颂之鸿蒙系统,《欢乐颂3》立项开拍,五美主演大换血,看清阵容后:熬夜都追...
  18. 自然语言处理工资一般是多少?NLP收入
  19. 20190507-学习dubbo有感于梁飞
  20. 服务器电源模块型号,服务器电源管理模块

热门文章

  1. wc 统计文件的行数
  2. 一种高效快速的内存池实现(附源码)
  3. 经典算法题每日演练——第一题 百钱买百鸡
  4. bailian 2754八皇后
  5. grep -R 关键字 目录
  6. XPath函数——字符串函数
  7. 梯度下降法和随机梯度下降法的区别
  8. Python进阶_wxpy学习:聊天对象
  9. C++类成员的初始化
  10. 牛客网-斐波那契数列