扫码关注官方订阅号
是比较两对象是否具有相同属性的类别的,当ture时为什么其哈希码一样啊,即内存地址一样啊?比较地址不是==吗?
业精于勤,荒于嬉;行成于思,毁于随。
首先,hashCode和内存地址没关系。
equals的定义是当两个对象等价时返回真,否则返回假。equals的实现通常要对比两个对象中的所有成员变量。如果某些成员变量为容器或对象,则也需要判断两个对象中的容器或对象是否相等。通常来说这是一个代价比较高的操作。
而hashCode的作用是用于hashMap和hashSet中确定存储位置以及在大规模等价比较中完成初筛(比如去重),其定义是当两个对象等价时必然有相等的hashCOde,不等价时尽量拥有不同的hashCode。在去重时,如果没有hashCode,那么需要进行n(n-1)/2次equals,而如果有了hashCode,就只需要进行n次hashCode和n(n-1)/2次int相等判断,然后在hashCode相等时再进行equals比较。效率会高得多。
hashCode的生成方式可以自己决定,可以是所有变量处理为数字后的和,可以是所有变量合并后md5再转为int。也可以是其中部分变量处理后的结果。总之hashCode的实现原则是保证两个equals为真的对象hashCode相同的前提下,使得equals为假的对象hashCode尽可能不同,同时还要提高hashCode自身的执行效率。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
首先,hashCode和内存地址没关系。
equals的定义是当两个对象等价时返回真,否则返回假。equals的实现通常要对比两个对象中的所有成员变量。如果某些成员变量为容器或对象,则也需要判断两个对象中的容器或对象是否相等。通常来说这是一个代价比较高的操作。
而hashCode的作用是用于hashMap和hashSet中确定存储位置以及在大规模等价比较中完成初筛(比如去重),其定义是当两个对象等价时必然有相等的hashCOde,不等价时尽量拥有不同的hashCode。在去重时,如果没有hashCode,那么需要进行n(n-1)/2次equals,而如果有了hashCode,就只需要进行n次hashCode和n(n-1)/2次int相等判断,然后在hashCode相等时再进行equals比较。效率会高得多。
hashCode的生成方式可以自己决定,可以是所有变量处理为数字后的和,可以是所有变量合并后md5再转为int。也可以是其中部分变量处理后的结果。总之hashCode的实现原则是保证两个equals为真的对象hashCode相同的前提下,使得equals为假的对象hashCode尽可能不同,同时还要提高hashCode自身的执行效率。