中易网

set集合中是怎么确保集合元素的唯一性?

答案:2  悬赏:0  
解决时间 2021-02-21 16:33
他的实现原理是什么?求高手解答
最佳答案
因为java的collection很多都需要hashCode(),例如HashTable
比如说你往里面存了一个值,你在取这个值的时候,java实际上通过hashCode()来找那个值,因为这样通常比较快。如果你覆盖了equals()方法,意味着原来不相等的两个对象现在可能变得相等,但hashCode()的值却不相等,这样你使用HashTable就会出现存进去的东西找不到。

不要忽略这个问题,因为HashTable等等类用的非常多,很可能就在一个你不知道的地方间接地用到了。java类的一个原则就是:你定义的任何类,都要考虑覆盖equals和hashCode方法。否则你的类就不能给其他人或其他地方用。
全部回答
你好,首先要明白一点:加入set里面的元素必须定义equals()方法以确保对象的唯一性。 第一个问题: treeset的底层实现是采用红-黑树的数据结构,采用这种结构可以从set中获取有序的序列,但是前提条件是:元素必须实现comparable接口,该接口中只用一个方法,就是compareto()方法。当往set中插入一个新的元素的时候,首先会遍历set中已经存在的元素(当然不是采用顺序遍历,具体采用什么方法,建议自己去看看源码),并调用compareto()方法,根据返回的结果,决定插入位置。进而也就保证了元素的顺序。 第二个问题: 上面已经说过,加入set里面的元素必须定义自己的equals()方法,但是对于良好的设计风格,最好在覆盖equals()方法的同时,也覆盖hashcode()方法,当然,对于treeset而言不用覆盖hashcode()方法也可。请记住:覆盖hashcode()方法的目的,只有一个原因就是提高效率。 在往set中插入新的对象时,首先会用该对象的hashcode()与已经存在对象的hashcode()做比较,如果相等,那就不能插入,如果不等,才会调用equals()方法,如果equals结果为true,说明已经存在,就不能再插入,如果为false,可以插入。 注:如果没有覆盖hashcode()方法,那就是只比较equals().对两个对象equals运算,是判断两个对象是否相等的关键。 第三个问题: 2)hashset与treeset区别: 1、treeset 是二差树实现的,treeset中的数据是自动排好序的,不允许放入null值 2、hashset 是哈希表实现的,hashset中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束 3、hashset要求放入的对象必须实现hashcode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的string对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
怎样删除百度搜索栏里所浏览过的东西
作文小组的名称???急~~~~
玛瑙怎么打磨用什么材料打磨原石的皮子怎么去
红孟营在哪里啊,我有事要去这个地方
高考完了要开始看学校么?怎麼看?
鱼世界水族这个地址在什么地方,我要处理点事
苹果超薄笔记本装双系统是否可以
存款65万,利息为1.54,三个月多少利息
在无锡这边住房公积金可以补交吗?以个人的名
果堰街到新都泰兴咋个坐车
南阳红泥湾怎么走
曲家沟村我想知道这个在什么地方
98÷4+98×7-98用简便方法怎么算
110米栏第一栏8步上栏犯规吗
天和假日酒店我想知道这个在什么地方
推荐资讯
西山根村地址有知道的么?有点事想过去
金诚日用品店怎么去啊,有知道地址的么
鸭血怎么吃味道好
铁铺村地址有知道的么?有点事想过去
仲信宠物医院地址有知道的么?有点事想过去
temp=_crol_(temp,1);与temp<<=1;的区别
洗澡一挠出红印是不是血淤
请问used up有被动语态吗?有那些词不能用被
有没有什么一种药能让人在10分钟之间发烧,急
X-TIME组合是上海铂熠文化传媒有限公司打造出
宁乡县中心敬老院这个地址在什么地方,我要处
“长鲸正崔嵬”-这句话什么意思,比喻什么?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?