Object源码

本文深入探讨了Java中Object类的重要性和基本方法,包括equals、hashCode、toString及clone等方法的实现原理与应用场景,同时介绍了哈希算法、哈希表的概念及哈希冲突的解决方案。

  Object对象是所有java对象的基础类。

  equals和hashCode方法公约:equals相等的两个对象hashCode一定相等,反之hashCode相等的两个对象,equals不一定相等。

  • equals

判断两个对象是否等价。

默认实现是return (this == obj);即判断两个对象的引用地址是否相同。

实际应用中需要判断两个对象值是否相等,并非判断对象的唯一性,所以一般会重写equals方法。

  • hashCode

哈希码的生成方法。

先理解几个概念。哈希算法、哈希表、哈希冲突、一致性哈希。

哈希算法:按照老外的套路,有个人叫哈希,发明了一种算法,就叫做哈希算法。这个有点扯,言归正传,哈希算法就是把任意长度的输入,通过哈希(常用的有取模)计算,得到固定长度的输出。常见的哈希算法有MD5加密、SHA1加密,HashMap的是实现中获取数组下标。

哈希表:java中的HashMap、HashTable、ConCurentHashMap都是哈希表的实现。哈希表解决了数组寻址容易、插入删除困难,链表插入删除容易、查找困难的问题。

哈希冲突:哈希表中,不同的输入值,通过哈希算法计算,会得带相同的哈希值,这样就会产生哈希冲突。常见解决哈希冲突的方法有开放寻址法、链表法(HashMap使用该方式)、再哈希法、建立公共溢出区。

java对象的哈希码是一个最多32位的数字,给哈希表使用。常见哈希码生成方法如下表:

数据类型哈希码生成方法
Booleanvalue ? 1231 : 1237
Byte、Short、Integer、Character(int)value
Long(int)(value ^ (value >>> 32))
高三十二位与低三十二位异或,取低三十二位
FloatfloatToIntBits(value)
Doublelong bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));
Strings[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
自定义对象建议先将对象转换为字符串,然后参考String的哈希码生成方式,保证每一位都参与运算
  • toString

将对象转换为字符串,默认实现是getClass().getName() + “@” + Integer.toHexString(hashCode()),即类名@16进制哈希码。实际应用中会重写该方法,输出属性值,如”name=”+name+”&pwd=”+pwd。

  • clone

对象拷贝。
浅拷贝:只拷贝属性值,属性对象拷贝的是引用地址。
深拷贝:即拷贝属性值,也拷贝属性对象,需要被拷贝对象和被拷贝对象的属性对象都要实现序列化接口。

  • getClass

获取当前对象的类信息。

  • finalize

垃圾回收方法。

  • wait、notify、notfiyAll

线程间通信方法。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值