博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java基础:Object类中的equals与hashCode方法
阅读量:5282 次
发布时间:2019-06-14

本文共 2974 字,大约阅读时间需要 9 分钟。

前言

  这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢。

一切皆对象

   对于软件工程来说面向对象编程有一套完整的解决方案:OOA、OOD、OOP,  作为程序员来讲,OOP其实是直接接触最多的。Java中OOP最直接的体现就是java.lang.Object了,一切都是对象(除了原生类型,原生类型的 PrimitiveClass对象由JVM启动时生成和加载),Object类主要就只有这么几个方法,其中getClass是反射的基石,notify、notifyAll、wait是多线程并发时常用的方法,其中比较有意思的就是hashCode与equals了,也是面试的时候面试官很喜欢问的一个问题。

public class Object {    private static native void registerNatives();    static {        registerNatives();    }    // finnal的本地方法,子类不能重写    public final native Class
getClass(); public final native void notify(); public final native void notifyAll(); public final native void wait(long timeout) throws InterruptedException; // 本地方法wait的包装方法 public final void wait(long timeout, int nanos) throws InterruptedException { if (timeout < 0) { throw new IllegalArgumentException("timeout value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException("nanosecond timeout value out of range"); } if (nanos >= 500000 || (nanos != 0 && timeout == 0)) { timeout++; } wait(timeout); } public final void wait() throws InterruptedException { wait(0); } // 为什么hashCode是本地方法,而equals却是成员方法呢? public native int hashCode(); public boolean equals(java.lang.Object obj) { return (this == obj); } protected native java.lang.Object clone() throws CloneNotSupportedException; public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } // 对象成员方法,对象被回收时执行的方法,一般不用来释放资源,因为GC的时机对程序员来说是不可控的 protected void finalize() throws Throwable { }}
View Code

equals与hashCode

  面试题的标准答案是:如果两个对象ab满足a.equals(b) == true,则它们的散列码(hash code)应当要相同,反之则不一定。这里也就引申出:重写了类的equals方法之后一定要重写hashCode方法,这种情况最常见的是在entity bean中,当bean跟容器类搭配使用时如果重写了equals而没重写hashCode就会引起问题,这里先来看看HashMap的getEntry方法,循环中就是先判断两个对象的hash值(由对象的hashCode计算得到)是否相等,再判断两个对象是否为同一对象最后才调equals方法来判断,这样可以减少equals方法的调用次数,提升容器的性能,如果大家看看Java容器类的源码就会发现大神们对hash思想的运用简直炉火纯青(生活中哈希的应用也随处可见:年月日、时分秒就是对时间流的哈希散列)

final Entry
getEntry(Object key) { int hash = (key == null) ? 0 : hash(key); for (Entry
e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }

 下面是一张抽象化的对比图:

hashCode一般是一个int值,比较两个对象的hashCode就是比较两个int值,Java中对原生类型操作的性能肯定要好于对方法的调用,所以我们才会在Java容器中看到那么多对hash的应用。

上面这张图也可以直观看出为什么说两个对象equals为true的话hashCode就一定相同,反之则不一定。

equals方法的四大特性

  通过equals方法的注解就能清晰看到Java大神们给我们总结的4大特性了(如果在面试中遇到equasl和hashCode的问题时一遍把四大特性阐述一下会是个小小的加分项):

  1、自反性:自己跟自己比较返回true

  2、对称性:x.equals(y) == y.equals(x)

  3、传递性:x.equals(y) == truey.equals(z) == truex.equals(z) == true

  4、一致性:多次调用equals返回结果相同

  (null与任何对象比较都应该返回false)

 

转载于:https://www.cnblogs.com/ocean234/p/8679863.html

你可能感兴趣的文章
jquery 对 table 的操作
查看>>
centos7 关闭防火墙
查看>>
Android 拍照图片选取与图片剪裁
查看>>
百度地图轨迹回放,自定义路书,边走边画线
查看>>
04-jQuery的属性操作
查看>>
PHP中---范围解析操作符(::)
查看>>
response实现文件下载
查看>>
【WP7】页面之间数据交互
查看>>
C++中的unique函数
查看>>
小白学数据分析----->流失分析设计
查看>>
FontAwesome 奥森图标的学习
查看>>
request response cookie session
查看>>
spring
查看>>
开源cms
查看>>
指针与引用
查看>>
THREADSPOOL
查看>>
jira集成fisheye代码深度查看工具安装绿色版
查看>>
C#跨线程操作控件的最简单实现探究
查看>>
Ubuntu server12.04安装JDK+Tomcat+mysql
查看>>
brock pallet
查看>>