equals() 是 java.lang.Object 的一个实例方法,被所有的子类所继承(可被复写)。

以下是 JDK 8 中 java.lang.Object.equals() 源码:

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

这个方法很简单,当自身和自身比较时,才返回 true。

不同的子类可能会重写这个方法,提供不同的实现。

下面是 JDK 8 java.lang.String.equals(Object anObject) 源码:

 /**
* Compares this string to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code
* String} object that represents the same sequence of characters as this
* object.
*
* @param anObject
* The object to compare this {@code String} against
*
* @return {@code true} if the given object represents a {@code String}
* equivalent to this string, {@code false} otherwise
*
* @see #compareTo(String)
* @see #equalsIgnoreCase(String)
*/
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;
}

从上面可以看到这个方法返回 true 的情况:

  1. 自己与自己比较;
  2. 两个对象都是String,且内容相同。

需要注意的:

1、equals()

实例方法,可以被子类重写;

必须满足自反性、对称性、传递性、一致性、not-null 和 null 永远不相等。

2、==

运算符,对于对象而言,判断引用是否相等,对于 primitive type 而言,判断值是否相等;

Java 不支持开发者重载运算符,但是 Java 自己重载了一些运算符(最常见的就是 +,+ 可以应用于数值、字符、字符串)。

3、equals() 和 hashCode() 关系密切

java.lang.Objecct.hashCode() 的实现比较简单,将对象在内存中的地址转换成一个整数,返回这个整数。

一般而言,如果 equals() 重写的话,hashCode() 也需要重写:要保证 equals() 返回 true 时,hashCode() 应该返回相同的值;equals() 返回 false 时,hashCode() 可能返回相同的值(JLS 对这种情形没有做规定,java.lang.String 就出现了这样的情况,即哈希碰撞),但最好还是返回不同的值。

4、java.lang.String.equals() 没有使用 hashCode()

java.lang.String 存在特例,不同的字符串具有相同的 hashCode (哈希碰撞),即 equals() 返回 false,但是 hashCode() 返回相同的值。

因此判断两个对象是否相等,最好使用 equals() 而非 hashCode() 进行判断。

可以阅读这篇文章。

JDK 8 equals() & ==的更多相关文章

  1. java中hashcode和equals的区别和联系

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...

  2. hashCode() 和equals() 区别和作用

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...

  3. java中equals相同,hashcode一定相同ma

    一.jdk中equals和hashcode的定义和源码进行分析 1.java.lang.Object中对equals()方法的定义 java.lang.Object中对hashCode()方法的定义 ...

  4. (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节

    背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...

  5. java学习-- equals和hashCode的关系

    hashcode的目的就是在hashset或者hashmap等中比较两个对象相等时,减少equals的使用次数来提高效率 以下为摘录 java中hashcode和equals的区别和联系 HashSe ...

  6. Java == ,equals 和 hashcode 的区别和联系(阿里面试)

    今天阿里的人问我 equals 与hashcode的区别,我答不上来, 仔细查了一下,做了总结: (1) == 这是Java 比较内存地址,就是内存中的对象: java中的==是比较两个对象在JVM中 ...

  7. 为什么要同时重写equals和hashcode

    原文地址https://blog.csdn.net/tiantiandjava/article/details/46988461 原文地址https://blog.csdn.net/lijiecao0 ...

  8. HashCode与Equals回顾

    HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...

  9. == 和 equals,equals 与 hashcode,HashSet 和 HashMap,HashMap 和 Hashtable

    一:== 和 equals == 比较引用的地址equals 比较引用的内容 (Object 类本身除外) String obj1 = new String("xyz"); Str ...

随机推荐

  1. JAVA基础补漏--基础数据类型与引用数据类型

    ==在不同数据类型中意义不同. 在基础数据类型中,表示的是数值的比较. 在引用数据类型中,表示的是内存地址值的比较. 一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit), ...

  2. js动态添加和删除标签

    html代码 <h1>动态添加和删除标签</h1> <div id="addTagTest"> <table> <thead& ...

  3. mysql基础(2)-数据处理(mysql+pandas)

    插入语句insert insert  数据表名(字段名...) values(字段值): 例 : insert into new_student values("张"," ...

  4. sqoop1.4.6 全量导入与增量导入 与使用技巧

    全量导入: sqoop import --connect jdbc:mysql://192.168.0.144:3306/db_blog --username root --password 1234 ...

  5. ZSTU 4241 圣杯战争(线段树+经典)

    题意:CS召唤了n个实验怪兽,第i号怪兽在i这个位置出.并把KI召唤出的第i位从者安排在pos(i)处,总共有m位从者. 第i只怪兽有战斗力atk(i), 而i号从者的体力为AP(i).如果从者想要移 ...

  6. 在eclipse中使用Github进行单元测试

    时间分配是找资料60%,动手实践40%.因为之前一直没怎么好好学习,导致看到使用Gunit进行单元测试的时候感觉像是看到了一行符号一样不知所措,还好现在搜索引擎很强大,找资料学习中间有找到一个现成的傻 ...

  7. Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 数学

    D. Vanya and Computer Game time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  8. POJ3468 splay

    线段树/树状数组裸题,用splay写 splay也是基本操作pushup pushdown 话说我就是找不到全一点的模板,我自己写又全是bug,导致代码风格一直变来变去= = 关键是建树和区间操作(区 ...

  9. 去掉标题栏的方法(使用requestWindowFeature(Window.FEATURE_NO_TITLE);为什么失效?不仅失效,可能会挂)

    使用requestWindowFeature(Window.FEATURE_NO_TITLE)隐藏标题栏失效的原因,不仅失效,可能会挂.可能是activity继承的是AppCompatActivity ...

  10. IDEA配置JavaWeb项目Artifacts