A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 iloveyou 于 2014-4-27 12:07 编辑

1.在HashSet中,存储自定义对象时,将要考虑hashCode()和equals()方法,这两个方法重写时的原则是什么?
2.TreeSet中equals()和compareto()重写时的原则是什么?

点评

建议你把毕老师视频看一遍!!!问题不是这样提的.分也不是这样赚的  发表于 2014-4-27 10:56

7 个回复

倒序浏览
对于HashSet重写hashCode方法是因为它的存储结构不同。
HashSet中是先把元素存到容器中,让后查找每一个元素对应的哈希编码,这个哈希编码是无序的
,查找完哈希吗如果发现不同则存进去,如果对象的哈希吗相同,则用equals方法比较对象中的每一个元素

而对于TreeMap方法,是使用的二叉树存储结构,在存储的时候小的放在左边,大的放在右边,然后如果通过compareTo方法比较大小
并且通过equals方法判断元素是否相同

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
hashSet 集合存数据时先比较的是hash值是否相同 而hashCode方法 返回的就是hash值  如果hash值相同就会去比较equalse方法 所以要保证hashSet 集合中元素的唯一性 必须覆盖hashCode和equalse方法
而treeset集合是用于排序的 往里面添加的元素自身需要有可比性 这就需要 元素自身实现comparable接口覆盖comparTo方法  如果元素自身不具有可比性  我们也可以让集合自身具有可比性  就是向集合构造方法中传递一个实现comparator接口 并覆盖compara方法的类的对象 让集合自身具备可比性

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一种,迭代器。
         |--HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;
                 HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
                 当元素的hashCode值相同时,才继续判断元素的equals是否为true。
                 如果为true,那么视为相同元素,不存。如果为false,那么存储。
                 如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。
       |--LinkedHashSet:有序,hashset的子类。
         |--TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。

哈希表的原理:
 1,对对象元素中的关键字(对象中的特有数据),进行哈希算法的运算,并得出一个具体的算法值,这个值 称为哈希值。
 2,哈希值就是这个元素的位置。
 3,如果哈希值出现冲突,再次判断这个关键字对应的对象是否相同。如果对象相同,就不存储,因为元素重复。如果对象不同,就存储,在原来对象的哈希值基础 +1顺延。
 4,存储哈希值的结构,我们称为哈希表。
 5,既然哈希表是根据哈希值存储的,为了提高效率,最好保证对象的关键字是唯一的。
         这样可以尽量少的判断关键字对应的对象是否相同,提高了哈希表的操作效率。

对于ArrayList集合,判断元素是否存在,或者删元素底层依据都是equals方法。
对于HashSet集合,判断元素是否存在,或者删除元素,底层依据的是hashCode方法和equals方法。

TreeSet:
         用于对Set集合进行元素的指定顺序排序,排序需要依据元素自身具备的比较性。
         如果元素不具备比较性,在运行时会发生ClassCastException异常。
         所以需要元素实现Comparable接口,强制让元素具备比较性,复写compareTo方法。
         依据compareTo方法的返回值,确定元素在TreeSet数据结构中的位置。
         TreeSet方法保证元素唯一性的方式:就是参考比较方法的结果是否为0,如果return 0,视为两个对象重复,不存。

注意:在进行比较时,如果判断元素不唯一,比如,同姓名,同年龄,才视为同一个人。
          在判断时,需要分主要条件和次要条件,当主要条件相同时,再判断次要条件,按照次要条件排序。

TreeSet集合排序有两种方式,Comparable和Comparator区别:
   1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
   2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
   第二种方式较为灵活。

评分

参与人数 1技术分 +1 收起 理由
SyouRai_Tsk + 1

查看全部评分

回复 使用道具 举报
向日葵的曙光 发表于 2014-4-27 08:16
对于HashSet重写hashCode方法是因为它的存储结构不同。
HashSet中是先把元素存到容器中,让后查找每一个元 ...

学的太差,谢谢回答
回复 使用道具 举报
skill20 发表于 2014-4-27 09:52
Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一种,迭代器。
         |--HashSet:底层数据结 ...

学的太差,谢谢回答
回复 使用道具 举报
微笑=.一瞬间 发表于 2014-4-27 09:35
hashSet 集合存数据时先比较的是hash值是否相同 而hashCode方法 返回的就是hash值  如果hash值相同就会去比 ...

学的太差,谢谢回答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马