JDK 8 equals() & ==
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 的情况:
- 自己与自己比较;
- 两个对象都是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() & ==的更多相关文章
- java中hashcode和equals的区别和联系
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- hashCode() 和equals() 区别和作用
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- java中equals相同,hashcode一定相同ma
一.jdk中equals和hashcode的定义和源码进行分析 1.java.lang.Object中对equals()方法的定义 java.lang.Object中对hashCode()方法的定义 ...
- (转)从一道面试题彻底搞懂hashCode与equals的作用与区别及应当注意的细节
背景:学习java的基础知识,每次回顾,总会有不同的认识.该文系转载 最近去面试了几家公司,被问到hashCode的作用,虽然回答出来了,但是自己还是对hashCode和equals的作用一知半解的, ...
- java学习-- equals和hashCode的关系
hashcode的目的就是在hashset或者hashmap等中比较两个对象相等时,减少equals的使用次数来提高效率 以下为摘录 java中hashcode和equals的区别和联系 HashSe ...
- Java == ,equals 和 hashcode 的区别和联系(阿里面试)
今天阿里的人问我 equals 与hashcode的区别,我答不上来, 仔细查了一下,做了总结: (1) == 这是Java 比较内存地址,就是内存中的对象: java中的==是比较两个对象在JVM中 ...
- 为什么要同时重写equals和hashcode
原文地址https://blog.csdn.net/tiantiandjava/article/details/46988461 原文地址https://blog.csdn.net/lijiecao0 ...
- HashCode与Equals回顾
HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键. 那么Java运行时环境是如何判断HashSet中相同对象.Ha ...
- == 和 equals,equals 与 hashcode,HashSet 和 HashMap,HashMap 和 Hashtable
一:== 和 equals == 比较引用的地址equals 比较引用的内容 (Object 类本身除外) String obj1 = new String("xyz"); Str ...
随机推荐
- JAVA基础补漏--基础数据类型与引用数据类型
==在不同数据类型中意义不同. 在基础数据类型中,表示的是数值的比较. 在引用数据类型中,表示的是内存地址值的比较. 一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit), ...
- js动态添加和删除标签
html代码 <h1>动态添加和删除标签</h1> <div id="addTagTest"> <table> <thead& ...
- mysql基础(2)-数据处理(mysql+pandas)
插入语句insert insert 数据表名(字段名...) values(字段值): 例 : insert into new_student values("张"," ...
- sqoop1.4.6 全量导入与增量导入 与使用技巧
全量导入: sqoop import --connect jdbc:mysql://192.168.0.144:3306/db_blog --username root --password 1234 ...
- ZSTU 4241 圣杯战争(线段树+经典)
题意:CS召唤了n个实验怪兽,第i号怪兽在i这个位置出.并把KI召唤出的第i位从者安排在pos(i)处,总共有m位从者. 第i只怪兽有战斗力atk(i), 而i号从者的体力为AP(i).如果从者想要移 ...
- 在eclipse中使用Github进行单元测试
时间分配是找资料60%,动手实践40%.因为之前一直没怎么好好学习,导致看到使用Gunit进行单元测试的时候感觉像是看到了一行符号一样不知所措,还好现在搜索引擎很强大,找资料学习中间有找到一个现成的傻 ...
- 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 ...
- POJ3468 splay
线段树/树状数组裸题,用splay写 splay也是基本操作pushup pushdown 话说我就是找不到全一点的模板,我自己写又全是bug,导致代码风格一直变来变去= = 关键是建树和区间操作(区 ...
- 去掉标题栏的方法(使用requestWindowFeature(Window.FEATURE_NO_TITLE);为什么失效?不仅失效,可能会挂)
使用requestWindowFeature(Window.FEATURE_NO_TITLE)隐藏标题栏失效的原因,不仅失效,可能会挂.可能是activity继承的是AppCompatActivity ...
- IDEA配置JavaWeb项目Artifacts