1. ==

Java中分两类数据类型:基本数据类型
boolean,byte,char,short,int,long,float,double
和类对象(的引用)。
a. 对于基本类型的==判断的是它们的值是否相等。
b. 对于对象(的引用)则判断的是它们是否指代同一个对象。例如:

A a = new A();
A b = a;
a == b; //true
A c = new A();
A d = new A();
c == d;//false

2.equals

boolean equals(Object o)方法继承自java.lang.Object类中,其中对它的实现默认如下:

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

可以看到通常equals方法是与==发挥同样的作用的。
一般为了功能需求会重写equals方法,通常重写的流程如下:

if(this == obj)
return true; // 如果指向同一对象,则为true
if(obj instanceof ClassName){//className 为该类的类名ClassName obj1 = (ClassName)obj;//此处比较类中各域(属性)的值是否相等,相等返回true
}
return false;

在这种情况下,equals方法发挥了真正比较两个对象的值是否相等的作用。
通常equals方法有以下特性(了解即可):
a.自反性:x.equals(x)一定为true。
b.对成性:x.equals(y) == true,y.equals(x) == true
c.传递性:x.equals(y) == true,y.equals(z) == true,则x.equals(z) == true
d.一致性:如果参与比较的对象都没有改变,则比较的结果也不发生改变。
e.非空性:x.equals(null)一定为false。

3.hashCode

public native int hashCode()方法返回一个基于对象的物理地址按照特定的hash算法计算出的一个哈希值。对于一个哈希算法(f=h(x))总是会出现以下性质:
a. 如果 a = b,则一定h(a) = h(b)
b. 如果 a != b,则可能会出现h(a)=h(b)
按照以上原理可知:
a. 同一个对象多次调用返回的都是同一个值
b. 如果a.equals(b),则一定有a.hashCode()等于b.hashCode()
c. 如果 !a.equals(b),则a.hashCode()不一定等于b.hashCode()。(如果这两者的hash值总是不相等则说明该哈希算法效率比较高)
d. 如果a.hashCode()不等于b.hashCode(),则a.equals(b)为假。
(以上是在不重写equals方法的基础上得出的结论)
因此,如果要重写equals方法,通常需要重写hashCode方法来保证二者满足以上的性质。
//源自jdk,java.lang.Object类中给出的解释。
以下给出jdk中java.lang.String类中对hashCode()方法的重写以及对equals方法的重写示例:

public boolean equals(Object obj){if(this == obj)return true;if(obj instanceof String){String anotherObject = (String)object;int n = value.length;//value是char数组if(n == anotherObject.length()){char[] v1 = value;char[] v2 = anotherString.value;int i = 0;while(n-- !=0 ){if(v1[i] != v2[i])return false;i++;}return true;}}return false;
}
public int hashCode(){int h = hash;//private int hash;对象初始化的时候为哈希cache初始化为0;if(h == 0 && value.length > 0){char[] val = value;for(int i = 0;i<value.length;i++){h = 31 * h + val[i];}hash = h;}return h;
}

Java == equals() hashCoed()的区别相关推荐

  1. java equals和==的区别

    大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...

  2. 【Java常识】6.0面向对象认知和Eclipse的实用使用、==号和equals方法的区别

    1.曾经写过很多自以为很通俗易懂的面向对象的解释. 如下是目前最通俗的一种解释: 2.Eclipse的补充解释. 运行的快捷键:F11. 3.Eclipse快捷键大全 大全放本文最后,这里主要放常用的 ...

  3. JAVA 中equals()与==的区别

    原文地址:http://www.chineselinuxuniversity.net/articles/29594.shtml 值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存 ...

  4. Java基础 抽象类和接口的区别、equals 与 == 的区别

    一.抽象类和接口有什么区别 抽象类与接口都用于抽象,但是抽象类可以有自己的部分实现,而接口规范某一行为,调用者实现这个接口. 主要区别: 1.抽象类还是类只能单继承,而接口却可以多实现. 2.抽象类满 ...

  5. Java基础之equals和==的区别深入解析

    Java基础之equals和==的区别深入解析 以下是本文目录大纲 equals 和 == 的区别 equals 的重写 复写hashCode方法,有31这个数字的作用 1. equals 和 == ...

  6. Java面试通关要点汇总集答案(七)——equals 与 == 的区别 List 和 Set 区别

    一.equals 与 == 的区别 首先equals和== 最大的区别是一个是方法一个是运算符,在Java中,"=="和Object()类的equals比较的都是物理地址,而不是值 ...

  7. java 夯实基础_夯实基础-java equals使用,和 == 的区别

    在研究hashcode的用法,发现自己对equals的理解还不够深,废话少说,继续专研,记录如下: 要想搞清楚equals和==的区别,就先要搞清楚JAVA的数据类型: java的数据类型只要分两大类 ...

  8. Java,哈希码以及equals和==的区别(转载)

    从开始学习Java,哈希码以及equals和==的区别就一直困扰着我.     要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方 ...

  9. Java,哈希码以及equals和==的区别

    从开始学习Java,哈希码以及equals和==的区别就一直困扰着我.要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方法还是St ...

最新文章

  1. 基本CSS选择器,复合选择器,后代选择器
  2. LeetCode-动态规划基础题-62. 不同路径
  3. ASCII和字母的转换
  4. android framework,GitHub - zhaozepeng/Android_framework: android framework 用来快速开发的android框架...
  5. 牛客题霸 [链表中倒数第k个结点] C++题解/答案
  6. Servlet异常和错误处理示例教程
  7. 一文快速掌握 Git 用法(Git介绍及使用流程)
  8. Vuforia3D模型上传
  9. 端口扫描php,php-批量端口扫描
  10. 执行mvn 报错 source-1.5 中不支持 diamond运算符
  11. editorloop 占用_【交换机在江湖-维护无忧系列】CPU占用率高故障专题(3)-常见故障案例...
  12. Java核心知识点精心整理(全是精华)
  13. vue.js ui框架_定制的第一个Vue.js电子商务UI框架
  14. python2 if写法_python 中if-else的多种简洁的写法
  15. matlab加载xls文件报错,服务器出现意外情况,远程过程调用失败
  16. 从session里面取得值为null
  17. 【ML】逻辑回归适用场景-原理-优缺点汇总:
  18. 【公益创投】“心健康护成长”来穗青少年心理健康项目联合琶洲街“丝路红星,与法同行”来穗与本土青少年融合社区教育服务项目启动仪式
  19. 四年Java 一个java程序员的年终总结
  20. 鸟哥的私房菜00--计算器概论

热门文章

  1. LabVIEW中ActiveX控件、ActiveX服务器和类型库注册
  2. 从Java 8 到 Java 14,几个令人印象深刻的新特性
  3. 远程连接服务器软件——十大常见的服务器管理软件
  4. 添加验证网站之CNAME验证操作-百度搜索资源平台
  5. vue+supermap三维地图(场景 模型 打包问题 报错)
  6. ajax异步登陆 cookie,通过ajax登录到远程系统并设置Cookie
  7. 《Effective Objective-C 2.0》读书笔记
  8. Rufus 格式化和创建可引导U盘的工具
  9. java content-length_java向服务器post请求时首部字段content-length的计算方法
  10. 必然与偶然,本质与细节