equals()

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

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

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

public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = count;if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) {if (v1[i++] != v2[j++])return false;}return true;}}return false;}

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

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

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

有两种用法说明:

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

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

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

比如:

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

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

  • 注意(1):

如果:

StringBuffer s1 = new StringBuffer("a");
StringBuffer 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”方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

比如:

class A{A obj1   =    new A();A obj2   = new A();}

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

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

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

总之

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

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

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

注意:

  • 如果是基本类型比较,那么只能用==来比较,不能用equals
public class TestEquals {
public static void main(String[] args)
{
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}
  • 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。
public class TestEquals {
public static void main(String[] args)
{ Integer n1 = new Integer(30);
Integer n2 = new Integer(30);
Integer n3 = new Integer(31);
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}

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

文章有不当之处,欢迎指正,你也可以关注我的微信公众号:好好学java,获取优质学习资源,也可以加入QQ技术交流群:766946816,咋们来聊聊java。

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

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

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

  2. 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)

    菜鸟学习笔记:Java提升篇10(网络2--UDP编程.TCPSocket通信) UDP编程 TCP编程(Socket通信) 单个客户端的连接 多个客户端的连接(聊天室案例) UDP编程 在上一篇中讲 ...

  3. 菜鸟学习笔记:Java提升篇4(容器4——Collections工具类、其他容器)

    菜鸟学习笔记:Java容器4--Collections工具类.其他容器 Collections工具类 容器其他知识点 队列Queue Enumeration接口 Hashtable Propertie ...

  4. 菜鸟学习笔记:Java提升篇3(容器3——泛型、排序)

    菜鸟学习笔记:Java容器3--泛型.排序 泛型 泛型类 泛型接口 泛型方法 泛型继承 通配符"?" 泛型知识点补充 容器排序 Comparable接口与compareTo方法 C ...

  5. 菜鸟学习笔记:Java提升篇2(容器2——Map、Set、迭代器)

    菜鸟学习笔记:Java容器2--Map.Set.迭代器 Map容器 HashMap的使用 Hash表讲解 Map实现 Set容器 HashSet的使用 实现 Iterator迭代器 Map容器 Has ...

  6. 菜鸟学习笔记:Java提升篇1(容器1——List)

    菜鸟学习笔记:Java容器1--List容器 容器基本概念 List容器 ArrayList 初始化 add方法 remove方法 LinkList 链表 双向链表 初始化 add方法 remove方 ...

  7. 在聊Java中的equals方法

    2019独角兽企业重金招聘Python工程师标准>>> java规范中equals方法特征 自反性(对于任何非空引用x, x.equals(x) 返回true;) 对称性(对于任何引 ...

  8. Java提升篇-事务隔离级别和传播机制

    转载自 Java提升篇-事务隔离级别和传播机制 问题的提出 为了保证并发操作数据的正确性及一致性,SQL规范于1992年提出了数据库事务隔离级别. 事务隔离级别分类 事务隔离级别由低往高可分为以下几类 ...

  9. 菜鸟学习笔记:Java提升篇12(Java动态性2——动态编译、javassist字节码操作)

    菜鸟学习笔记:Java提升篇12(Java动态性2--动态编译.javassist字节码操作) Java的动态编译 通过脚本引擎执行代码 Java字节码操作 JAVAssist的简单使用 常用API ...

最新文章

  1. Linux 性能分析工具总结
  2. Go 变量及基本数据类型2
  3. 【机器学习】Pandas练习题-提高你的数据分析技能
  4. Quest Spotlight On Oracle 很牛的监控软件
  5. com.alibaba.dubbo.rpc.RpcException: Forbid consumer 192.168.184.1 access service com.foreveross.syst
  6. 飞车手游服务器维护,QQ飞车手游更新出现异常怎么办 更新异常原因及解决方法技巧...
  7. 宏观经济学思维导图_2019中央财经大学803经济学经验分享|三跨考生
  8. 消息中间件学习总结(18)——MQ常见面试题总结
  9. Java IO实战操作(二)
  10. jQuery 表单应用:全选/取消全选,表单验证,网页选项卡切换
  11. 怎么利用c 语言编程进行进制计算,编程达人 《汇编、C语言基础教程》第一章 进制1.1 进制的定义(连载)...
  12. 小蚂蚁学习C语言(27)——C语言中的进制转换
  13. 汤国安《地理信息系统教程》(第二版)笔记(1)——概论
  14. BabeLua--Lua调试器
  15. 广告管理系统-数据库表设计
  16. typora主题配置:公众号一键排版
  17. php的fopen函数打开文件详解以及如何打开中文名文件
  18. dedecms织梦 list列表页pagesize数量不对
  19. 物流管理过程中如何避免客户个人隐私信息泄露
  20. Minecraft 1.12.2模组开发(四十五) 水火两用船

热门文章

  1. Boost Asio总结(16)例子
  2. 区块链BaaS云服务(33)印度国家支付 Vajra Platform
  3. 4.1 Qt绘图原理
  4. 07- Firmware Update (FWU)
  5. linux kernel中的wait_for_completion和complete总结
  6. android手机系统的启动流程-secureboot流程(以MTK平台为例)
  7. 2020-11-8(activity状态以及任务栈)
  8. Windows进程与线程学习笔记(四)—— 等待链表调度链表
  9. 用户层和内核层异常的处理流程
  10. 9、使用GROUP BY分组查询