点击上方“好好学java”,选择“置顶公众号”

优秀学习资源、干货第一时间送达!

好好学java

java知识分享/学习资源免费分享

关注

精彩内容

你所需要的java全套视频教程

你所需要的java电子图书

你所需要的大数据视频教程

你所需要的java练习项目

equals()

超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等。该方法的源码如下:

1public boolean equals(Object obj) {
2    return (this == obj);
3    }

我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的的内存地址,所以说使用Object的equals()方法是比较两个对象的内存地址是否相等,即若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。虽然有时候Object的equals()方法可以满足我们一些基本的要求,但是我们必须要清楚我们很大部分时间都是进行两个对象的比较,这个时候Object的equals()方法就不可以了,实际上JDK中,String、Math等封装类都对equals()方法进行了重写。下面是String的equals()方法:

 1public boolean equals(Object anObject) {2    if (this == anObject) {3        return true;4    }5    if (anObject instanceof String) {6        String anotherString = (String)anObject;7        int n = count;8        if (n == anotherString.count) {9        char v1[] = value;
10        char v2[] = anotherString.value;
11        int i = offset;
12        int j = anotherString.offset;
13        while (n-- != 0) {
14            if (v1[i++] != v2[j++])
15            return false;
16        }
17        return true;
18        }
19    }
20    return false;
21    }

对于这个代码段:if (v1[i++] != v2[j++])return false;我们可以非常清晰的看到String的equals()方法是进行内容比较,而不是引用比较。至于其他的封装类都差不多。

equals()方法和“==”运算符比较

首先笼统的来讲   “java中equals()方法和“==”运算符”   都是比较的地址,那为什么我们在使用中总会出现混淆的情况呢老是弄错呢,这是因为“重写equals()方法”和一些 “特殊情况”的存在。

有两种用法说明:

(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。

  • ==”比较两个变量本身的值,即两个对象在内存中的首地址。

  • equals()”比较字符串中所包含的内容是否相同。

比如:

1String s1,s2,s3 = "abc", s4 ="abc" ;
2s1 = new String("abc");
3s2 = new String("abc");

结果:
s1==s2 是 false      //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,故不相等。
s1.equals(s2) 是 true     //两个变量的所包含的内容是abc,故相等。

  • 注意(1):

如果:

1StringBuffer s1 = new StringBuffer("a");
2StringBuffer s2 = new StringBuffer("a");

结果:          s1.equals(s2) //是false

解释:
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,而Object类中的equals方法是用来比较“地址”的,所以等于false.

  • 注意(2):

对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true(即使没有s3=s4这样一个赋值语句)

(2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

比如:

1class A
2{
3      A obj1   =    new A();
4      A obj2   = new A();
5}

结果:
obj1==obj2是false
obj1.equals(obj2)是false

但是如加上这样一句:obj1=obj2;

结果 :
obj1==obj2 是true
obj1.equals(obj2) 是true

总之

equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。

== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。

String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。

注意:

  • 如果是基本类型比较,那么只能用==来比较,不能用equals

 1public class TestEquals {2public static void main(String[] args) 3{4int a = 3;5int b = 4;6int c = 3;7System.out.println(a == b);//结果是false8System.out.println(a == c);//结果是true9System.out.println(a.equals(c));//错误,编译不能通过,equals方法
10//不能运用与基本类型的比较
11}
12}
  • 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。

 1public class TestEquals {2public static void main(String[] args) 3{ Integer n1 = new Integer(30);4Integer n2 = new Integer(30);5Integer n3 = new Integer(31);6System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,7System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false8System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true9System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
10}
11}

这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。

附上热门QQ群,存放资源和历史资料,500容量(低门槛付费群),长按二维码入群


长按二维码关注

Java基础提升篇:equals()方法和“==”运算符相关推荐

  1. Java基础知识之equals方法

    <Java核心技术> 1.equals方法介绍以及重写 Object类中的equals方法是用于检测两个对象是否相等,在Object类中equals方法的具体实现是确定两个对象引用是否相等 ...

  2. Java基础提升篇:equals()与hashCode()方法详解

    概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承 ...

  3. Java提升篇——equals()方法和“==”运算符

    equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) {retur ...

  4. java基础提升篇:深入剖析Java中的装箱和拆箱

    一.什么是装箱?什么是拆箱? 我们知道 Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5 ...

  5. 【Java基础】重写equals方法详讲

    一.重写equals方法 [Java比较学习]重写equals方法的安全写法 1.重写equals方法的两种方式 这里提供两个比较常见的equals重写方法: ● 用instanceof实现重写equ ...

  6. 你所需要的java基础提升篇大总结

    java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序 ...

  7. 【通知】+ java基础提升篇:Java 序列化的高级认识

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 你所需要的 ...

  8. java基础提升篇:深入浅出Java多线程

    初遇 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线程 ...

  9. java基础提升篇:Java 序列化的高级认识

    如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件.那你最好再阅读该篇文章,文章对序列化进行了更深一步的讨论,用实际的例子代码讲述了序列化的高级认识,包括父类序列化的问题.静 ...

最新文章

  1. EntLib 3.1学习笔记(5) : Exception Handling Application Block
  2. 一学长毕业临走前和我说的话
  3. 【OpenGL从入门到精通(二)】绘制一个点
  4. Silverlight实用窍门系列:63.Silverlight中的Command,自定义简单Command
  5. socket接收时信号量阻塞了会丢数据吗_浅谈Java网络编程——非阻塞I/O
  6. 【系统架构】大型网站架构模式
  7. java.lang.UnsatisfiedLinkError: Library not loaded: @rpath/libo.dylib Reason: image not found
  8. Windows端口扫描关闭工具
  9. Java实现文件搜索
  10. php获取上周一,php strtotime 如何获取上周一的时间呢?-1 monday不对
  11. 芋头怎么蒸好吃 蒸芋头的技巧有哪些
  12. html网页运行环境,网站运行的环境要求
  13. linux硬件命令大全,Linux硬件信息命令大全
  14. 百度地图LBS应用开发代码
  15. OPENCV计算机视觉图像处理频域傅里叶 DFT 变换低通滤波逆变换IDFT
  16. [re]符号执行一把梭:2020网鼎杯青龙组re_signal_wp
  17. 深度分析网络游戏运营手段
  18. 多普达830玩友玩祖玛的时候要小心啊
  19. 大数据技术与应用4-4MapRuduce
  20. 青龙-腾讯自选股双端[简单稳定]

热门文章

  1. 21IC上关于stm32 option bytes的操作帖子记录
  2. minigui显示时遇到的一个问题(暂时记下来)
  3. 蓝牙BLE LINK LAYER剖析(一) -- status and channel
  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化
  5. 深度探索C++ 对象模型(4)-Default Copy Constructor(2)
  6. 设计模式--组合(Component)模式
  7. ubuntu中pycharm打不开的的处理方法
  8. UnboundLocalError: local variable ‘XXX‘ referenced before assignment解决办法
  9. 广西2021各校高考成绩查询入口,2021年广西高考成绩排名查询系统,广西高考位次排名查询...
  10. Windows消息机制学习笔记(一)—— 消息队列