黑马程序员技术交流社区

标题: Set 里的元素是不能重复的,那么用什么方法来区分重复与... [打印本页]

作者: 阳丹    时间: 2013-6-7 01:12
标题: Set 里的元素是不能重复的,那么用什么方法来区分重复与...
本帖最后由 阳丹 于 2013-6-7 22:40 编辑

Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?  是用==还是 equals()?  它们有何区别
作者: a464538715    时间: 2013-6-7 01:21
利用equals方法判断是否为同一个对象 equals同时也会调用hashCode方法比较地址值
作者: a464538715    时间: 2013-6-7 01:21
==是比较内存地址的
作者: 刘凯    时间: 2013-6-7 01:53
这个视频中会有想详细讲解的, 建议楼主自习看视频先
作者: 曾林魁    时间: 2013-6-7 07:26
本帖最后由 曾林魁 于 2013-6-7 12:16 编辑

对于这个问题,你首先得要知道set 集合底层的数据结构;他实际上底层运用的是map集合中的方法来实现的。所以对于像hashset集合判断重复元素,首先要根据所比较对象的hashCode()方法来比较两对象是否有相同的哈希值;如果两对象哈希值相同,则用equals()方法比较两对象是否重复;而对于Treeset判断的依据可以是所存对象的自己实现的Comparable接口的comparato(0方法;也可以是特定的实现了comparator接口的compara()方法的比较器;
至于 == 和equals()方法的区别,请看下面解释:
对于==他经常用来比较两个数值型量是否相等;当用==比较两个对象时他实际比较的是两个对象的引用的值,也就是对象的地址值(哈希值);
equals()方法是Object类中的方法:他常用来比较两对象的值是否相同;在Object中的equals()方法他实际上比较的也是对象的哈希值;但是当我们在创建类时经常复写了equals()方法,用他来提供比较两对象是否相同的依据:也有些类是已经复写了equals()方法的,像String类等;

其实建议你在学集合框架这里的时候;你最好是先看看数据结构的知识,像哈希表,二叉树,链表等,有助于你理解;还有就是你得先明白Object中的hashCode()方法和equals方法的用法;

作者: 王靖远    时间: 2013-6-7 11:04
hashset用equals和hashCode保证唯一性 treeset用comparable或者comparator保证唯一性
作者: 刘凯    时间: 2013-6-7 12:55
多出质量贴 这种贴 视频中明确讲到的  发问者是很难得到分的
作者: 花心々小土豆    时间: 2013-6-7 17:28
刘凯 发表于 2013-6-7 12:55
多出质量贴 这种贴 视频中明确讲到的  发问者是很难得到分的

不能这么说吧,楼主可能是不太了解哈希存储结构和二叉树存储结构,进而对为什么hashset用hashCode()和equals()保证唯一有疑惑…………
我们应该知道为啥这样,而不是是这样就行。
作者: a464538715    时间: 2013-6-7 18:32
刘凯 发表于 2013-6-7 12:55
多出质量贴 这种贴 视频中明确讲到的  发问者是很难得到分的

大家都在喷你 你好意思吗 版主? 人家是不懂就问怎么了 就算问题简单又怎么样 人家至少在学在问 不可能各个都有你牛逼啊 都能出现你自认为的质量帖 版主你这样的行为早晚会被众人说的
作者: a464538715    时间: 2013-6-7 18:34
花心々小土豆 发表于 2013-6-7 17:28
不能这么说吧,楼主可能是不太了解哈希存储结构和二叉树存储结构,进而对为什么hashset用hashCode()和equ ...

支持你 也支持楼主 版主我真心不知道怎么说他
作者: 王松松    时间: 2013-6-7 18:36
表示支持版主,有些问题完全可以自己解决的应该自己解决好一点!
作者: 胡晓思    时间: 2013-6-7 18:43
刘凯 发表于 2013-6-7 12:55
多出质量贴 这种贴 视频中明确讲到的  发问者是很难得到分的

其实呢!质量贴这是个什么样子的标准呢?大神无法明白刚入门的小菜鸟的苦恼啊!不过大神也是从菜鸟过去的嘛!  
而且怎么说呢?在论坛也混了一段时间了  大家讨论的也都是些基础的问题呢  问题太大  根本很难有为了技术分的小菜菜能回答嘛! 大家都是初学者  说是提问  大都发问者自己是知道答案的   因为获取答案的通道实在太多太多了  而且会快很多   只是觉得有些有价值的问题发出来  曾经让自己疑惑过的问题  发出来  大家分享而已  顺便得个技术分 混个脸熟啥的  大家说是这么个事么咯?
作者: 胡晓思    时间: 2013-6-7 18:44
王松松 发表于 2013-6-7 18:36
表示支持版主,有些问题完全可以自己解决的应该自己解决好一点!

其实呢!质量贴这是个什么样子的标准呢?大神无法明白刚入门的小菜鸟的苦恼啊!不过大神也是从菜鸟过去的嘛!  
而且怎么说呢?在论坛也混了一段时间了  大家讨论的也都是些基础的问题呢  问题太大  根本很难有为了技术分的小菜菜能回答嘛! 大家都是初学者  说是提问  大都发问者自己是知道答案的   因为获取答案的通道实在太多太多了  而且会快很多   只是觉得有些有价值的问题发出来  曾经让自己疑惑过的问题  发出来  大家分享而已  顺便得个技术分 混个脸熟啥的  大家说是这么个事么咯?
作者: 王松松    时间: 2013-6-7 18:51
胡晓思 发表于 2013-6-7 18:44
其实呢!质量贴这是个什么样子的标准呢?大神无法明白刚入门的小菜鸟的苦恼啊!不过大神也是从菜鸟过去的嘛! ...

是这么个事,有问题提出来大家帮解决是毫无疑问的,但是菜鸟更应该自强不息!
作者: 胡晓思    时间: 2013-6-7 19:05
王松松 发表于 2013-6-7 18:51
是这么个事,有问题提出来大家帮解决是毫无疑问的,但是菜鸟更应该自强不息! ...

哦  那好吧! 我有一个小问题不好意思去版面发帖了,是这么一个问题啦!
前不久在看赵栋老师的OA   SSH的   
里面老师使用泛型重构了Dao层的代码  让代码变得特别优雅简洁  老师提过 可以类似的实现Service层的 泛型重构
我鼓捣了好久终究不得办法,网上也搜不到  这个确实没办法了  
其实也只有一个小问题了  就是BaseServiceImpl<T>  这个基类里怎么才能按照需要动态的注入 **Dao?
作者: 阳丹    时间: 2013-6-7 19:21
刘凯 发表于 2013-6-7 12:55
多出质量贴 这种贴 视频中明确讲到的  发问者是很难得到分的

大家在论坛里面问的大部分都是java基础,我也是刚学不久,不一定能吸收视频里面讲过的所有内容。不懂就问,我也是希望自己理解深刻一点。何况论坛里面有很多这种问这种视频里面明确讲过的知识点。怎么版主就认为我问得的特别没质量呢
作者: 阳丹    时间: 2013-6-7 19:21
刘凯 发表于 2013-6-7 12:55
多出质量贴 这种贴 视频中明确讲到的  发问者是很难得到分的

大家在论坛里面问的大部分都是java基础,我也是刚学不久,不一定能吸收视频里面讲过的所有内容。不懂就问,我也是希望自己理解深刻一点。何况论坛里面有很多这种问这种视频里面明确讲过的知识点。怎么版主就认为我问得的特别没质量呢
作者: 黑马伍哲沂    时间: 2013-6-7 21:19
21期在技术分的奖励上稍微严格些。不会为难大家入学的技术分要求。但希望提问尽量结合代码和具体问题。

一句话问题并知识显得非常基础,能在视频里轻易得到答案的,21版主一般不予技术分奖励哦。

如果问题解决。及时更换帖子状态到以解决。谢谢。
作者: 胡晓思    时间: 2013-6-7 22:10
黑马伍哲沂 发表于 2013-6-7 21:19
21期在技术分的奖励上稍微严格些。不会为难大家入学的技术分要求。但希望提问尽量结合代码和具体问题。

一 ...

支持一下
作者: 刘凯    时间: 2013-6-7 23:45
a464538715 发表于 2013-6-7 18:32
大家都在喷你 你好意思吗 版主? 人家是不懂就问怎么了 就算问题简单又怎么样 人家至少在学在问 不可能各 ...

欢迎提意见 ! 过后我会出个意见贴, 对于这问题到底该怎么去问 ,望跟帖!
作者: 刘凯    时间: 2013-6-7 23:46
花心々小土豆 发表于 2013-6-7 17:28
不能这么说吧,楼主可能是不太了解哈希存储结构和二叉树存储结构,进而对为什么hashset用hashCode()和equ ...

欢迎提意见 ! 过后我会出个意见贴, 对于这问题到底该怎么去问 ,望跟帖!
作者: 刘凯    时间: 2013-6-7 23:46
胡晓思 发表于 2013-6-7 18:43
其实呢!质量贴这是个什么样子的标准呢?大神无法明白刚入门的小菜鸟的苦恼啊!不过大神也是从菜鸟过去的嘛! ...

欢迎提意见 ! 过后我会出个意见贴, 对于这问题到底该怎么去问 ,望跟帖!
作者: 刘凯    时间: 2013-6-7 23:47
阳丹 发表于 2013-6-7 19:21
大家在论坛里面问的大部分都是java基础,我也是刚学不久,不一定能吸收视频里面讲过的所有内容。不懂就问 ...

欢迎提意见 ! 过后我会出个意见贴, 对于这问题到底该怎么去问 ,望跟帖!
作者: 李希鹏    时间: 2013-6-8 07:49
刘凯 发表于 2013-6-7 12:55
多出质量贴 这种贴 视频中明确讲到的  发问者是很难得到分的

出发点就错了,论坛上很多都是超过25分还来帮助解决问题的人,论坛是帮助新手解决问题,不是帮助你们拿技术分
作者: librazeng    时间: 2013-6-9 12:32
本帖最后由 librazeng 于 2013-6-9 12:35 编辑

set接口的子类主要有TreeSet和HashSet,两者保证元素的唯一性的办法是不同的。
TreeSet:
这个集合采用的是二叉树结构存储数据,如下图

二叉树的算法
TreeSet集合存储元素的时候,采用元素的自然排序(元素实现Comparable接口,覆写ComparaTo方法)或者集合添加的比较器(比较器实现Comparator接口,覆写Compare(obj o1,obj o2)方法),通过二叉树排序来发现是否有元素重复,如果重复就不再存储了。
HashSet:
这个集合实际是个链表数组,利用元素自身的hashCode()和equals()方法,先比较元素的哈希值是否相等(哈希算法为每个元素生成一个伪随机数,但可能出现不同的元素算出相同哈希值的情况),如果不同就存入链表数组中;如果相等再比较元素是否相同,如果哈希值相同,但元素不同,则会用解决哈希冲突的算法,将两个元素存入链表数组中。

作者: 8047107    时间: 2013-6-9 21:00
楼主看开点。记住发帖不仅仅为了技术分就行了。我们是来问问题的。再简单的不懂就问就行,只要不被版主删除就行。是吧?不要技术分又何妨?分不给就不要呗!
懂了这个知识才是硬道理!加油,同样学基础!
作者: 北极£莜蓝    时间: 2013-6-15 22:50
应该从它俩的区别谈起,==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。所以应该用equals()来判断




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2