JavaSE Object类型中的常用方法

面试题:JavaSE Object类型中的常用方法:hashCode(),equals(),clone()。解释每个方法的作用,使用在什么场景,结合其他技术进行描述。

hashCode()方法:返回对象的hash编码

hash编码是表示一个对象状态特性的数字,数字要求是:相同的对象必须返回相同的hash码,不同的对象尽可能返回不同的hash码。
例子:根据身份证号找一个人。

equals()方法:比对两个对象是否相同。

相同的对象返回true,反之返回false。
在代码中比对对象的属性特征。比对规则有对象非空、类型相同、比较属性特征。
equals方法的5个特性:
自反性:对于任何对象x,x.equals(x)应该返回true
对称性: 对于任何两个对象x和y,如果x.equals(y)返回true,那么y.euqals(x)也应该返回true
传递性:对于多个对象x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,则y.equals(z)也应该返回true
一致性:对于两个非空对象x,y,在没有修改此对象的前提下,多次调用返回的结果应该相同
对于任何非空的对象x,x.equals(null) 都应该返回false

boolean equals(Object o){
	if(0==null) return false;
	if(0==this) return true;
	if(o.getClass()!=this.getClass()) return false;
	ThisClass other == (ThisClass)o;
	//依次比对属性
	Object.equals(x,other.x);
}

例子:根据DNA找人

clone()方法:复制一个当前对象,并返回

Object中提供的clone方法是一个native方法,默认为浅拷贝。
浅拷贝:对象中的属性为引用类型属性,拷贝出是新复制对象,其引用类型属性指向原对象的引用类型属性。Override clone 方法。需要考虑深拷贝实现。就是将类型中的引用类型属性,再次做clone。
注意:clone方法的修饰符是protected。不是任意位置都可以调用的。

使用场景(结合技术描述)

  1. HashMap - key : key要求对象不能重复。key的非重复判定,是通过hashcode+equals实现的,先调用hashcode方法,获取对象的hash码,在通过散列算法,计算这个对象在hash表中的存储位置。在这个存储位置上,通过equals比较,同位置对象是否相同。

  2. Objects工具类:1.7提供的新的类型,是一个工具类。都是静态方法
    工具类中提供了equals方法、hashcode方法的工具实现。
    equals比较所有的基本数据类型、常用类型数据。

 public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
public static boolean deepEquals(Object a, Object b) {
        if (a == b)
            return true;
        else if (a == null || b == null)
            return false;
        else
            return Arrays.deepEquals0(a, b);
    }

hashcode方法 是使用最大素数(31)计算散列值。


clone() 方法:保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。主要是java中除了8中基本数据类型参数是值传递,其他类对象传参数都是引用传递,我们有时候不希望在方法里将参数改变,这里就需要在类中复写clone方法实现深复制。

浅复制—(原对象和克隆对象不同,但是对象内的成员引用相同)
深复制—(原对象和克隆对象不同,且对象内的成员引用也不相同)
不同:不是同一个对象,所占内存地址不同
成员引用:类中为引用类型的成员

equals()方法:对象相等判断的方法。

object中的equals方法是直接判断this和obj本身的值是否相等,即用来判断调用equals的对象和形参obj所引用的对象是否是同一个对象。同一对象是指内存中同一块存储单元,如果this和obj指向的是同一块内存对象,则返回true,相反返回false。
注意:即使是内容完全相等的两块不同的内存对象,也返回false。
如果同一块内存,object中的equals方法返回true,如果时不同返回false
如果希望不同内存但相同内容的两个对象equals时返回true,则需要我们重写父类的equals方法
string类已经重写了object中的equals方法(这样就是可以比较内容是不是相等了)
当equals方法被重写时,需要重写hashcode方法,以维护hashcode方法的规定,即等价对象具有相等的哈希码。

hashcode()方法:返回散列值,是有native方法实现的底层。而equals()方法是判断两个对象是否等价。等价的两个对象散列值一定相同,但是散列值相同的两个对象不一定等价。
在重写equals方法是需要总是覆盖hashcode方法,保证等价的两个对象散列值也相等。

equals和hashcode方法常用到hashmap

为什么重写equals方法就必须重写hashcode方法?
equals方法和hashcode方法都属于object类
equals方法是判断来两个对象是否是同一个对象,在底层使用了“==”来实现,也就是通过比较两个对象的内存地址是否相同判断是否是同一个对象,世界上equals方法通常没有太大的实用价值,往往需要equals方法来判断2个对象在逻辑上是否相等,而非验证他的唯一性,这样就需要在实现自己的类时,重写equals方法。

hashcode方法是一个native方法,哈希值的计算利用的就是内存地址。
在Java应用程序执行期间,在对同一对象多次调用hashcode方法时,必须一致的返回相同的整数,前提是对象进行equals比较时所用的信息没有被修改。从某一个应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据equals方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashcode方法都必须生成相同的整数结果。
如果根据equals方法的两个对象不相等,那么对这两个对象中的任意一个对象上调用hashcode方法不要求一定生成不同的整数结果,但是程序员应该意识到为不相等的对象生成不同整数结果可以提高哈希表的性能。

equals()方法相等,hashcode()必须相等;反之,equals方法不相等,hashcode可以相等,可以不相等。但是两者的一致有利于提高哈希表的性能。

equals()相等的的两个等价对象因为hashCode不同,所以在hashmap中的table数组的下标不同,从而这两个对象就会同时存在于集合中,在调用hashmap集合中的方法时就会出现逻辑的错误,也就是,你的equals()方法也“白白”重写了。

因此,对于“为什么重写equals()就一定要重写hashCode()方法?”这个问题应该是有个前提,就是你需要用到HashMap,HashSet等Java集合。用不到哈希表的话,其实仅仅重写equals()方法也可以吧。而工作中的场景是常常用到Java集合,所以Java官方建议重写equals()就一定要重写hashCode()方法。

toString()方法:返回一个字符串,该字符串由类名(对象时该类的一个实例)@标记符和此对象哈希码的无符号十六进制表示组成。

wait()方法:使当前线程等待该对象的锁,当前线程必须是该对象的拥护者也就是具有该对象的锁。
wait()方法是一直等待,直到获得锁或者被中断。wait(long timeout)设置一个超时间隔。在规定时间内没有获得锁就返回。

notify()方法:唤醒在该对象上等待的某个线程
notifyall()方法:唤醒在该对象上等待的所有线程

finalize()方法:​ 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法,该方法用于释放资源。

object常用方法详解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值