Object对象是所有java对象的基础类。
equals和hashCode方法公约:equals相等的两个对象hashCode一定相等,反之hashCode相等的两个对象,equals不一定相等。
- equals
判断两个对象是否等价。
默认实现是return (this == obj);即判断两个对象的引用地址是否相同。
实际应用中需要判断两个对象值是否相等,并非判断对象的唯一性,所以一般会重写equals方法。
- hashCode
哈希码的生成方法。
先理解几个概念。哈希算法、哈希表、哈希冲突、一致性哈希。
哈希算法:按照老外的套路,有个人叫哈希,发明了一种算法,就叫做哈希算法。这个有点扯,言归正传,哈希算法就是把任意长度的输入,通过哈希(常用的有取模)计算,得到固定长度的输出。常见的哈希算法有MD5加密、SHA1加密,HashMap的是实现中获取数组下标。
哈希表:java中的HashMap、HashTable、ConCurentHashMap都是哈希表的实现。哈希表解决了数组寻址容易、插入删除困难,链表插入删除容易、查找困难的问题。
哈希冲突:哈希表中,不同的输入值,通过哈希算法计算,会得带相同的哈希值,这样就会产生哈希冲突。常见解决哈希冲突的方法有开放寻址法、链表法(HashMap使用该方式)、再哈希法、建立公共溢出区。
java对象的哈希码是一个最多32位的数字,给哈希表使用。常见哈希码生成方法如下表:
数据类型 哈希码生成方法 Boolean value ? 1231 : 1237 Byte、Short、Integer、Character (int)value Long (int)(value ^ (value >>> 32))
高三十二位与低三十二位异或,取低三十二位Float floatToIntBits(value) Double long bits = doubleToLongBits(value);
return (int)(bits ^ (bits >>> 32));String s[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
线程间通信方法。
本文深入探讨了Java中Object类的重要性和基本方法,包括equals、hashCode、toString及clone等方法的实现原理与应用场景,同时介绍了哈希算法、哈希表的概念及哈希冲突的解决方案。
1280

被折叠的 条评论
为什么被折叠?



