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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐见 中级黑马   /  2012-9-2 21:30  /  2561 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

向TreeSet集合中存储对象,对象不重写hashCode和equals方法,为什么也能保证元素不重复。

评分

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

查看全部评分

6 个回复

倒序浏览
TreeSet集合底层结构是二叉树,如果元素本身具备比较性,则需要实现 Comparable接口,重写compareTo方法,如果元素自身不具备比较性,可以自定义一个比较器需要实现Comparator接口,重写compare方法,让比较器来比较。

评分

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

查看全部评分

回复 使用道具 举报
Set集合.本身就是一个无序的,元素不可重复的集合,Set底层的数据结构是二叉树结构,往里存数据的时候,就会按照默认的比较方法进行存储
回复 使用道具 举报
TreeSet集合必须要保证元素的唯一性。否则是存不进集合中的。
保证元素的唯一性:1)让元素自身具备比较性。元素需要实现Comparable接口,覆盖方法compareTo。
                  2)当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性。定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

你说的对象不重写hashCode和equals方法也能保证元素不重复,那可能是你存的元素自身就具有比较性,例如String类型。
回复 使用道具 举报
Object类和他的很多子类都已经有了hashCode和equals方法,如果楼主存储的数据是常见的类型如String类型的,Integer类型的。。。那么他们都会调用他们自己已有的hashCode和equals方法来保证元素不重复。但如果楼主要存入的是自定义类型的数据,如Student类,Car类等,最好要重写hashCode和equals方法。
回复 使用道具 举报
|--Set 元素无序(存储顺序和取出顺序不一致),不可重复。
                |--HashSet
                        底层数据结构是哈希表。线程不安全。
                        如果保证元素的唯一性呢?
                        A:首先根据hashCode值判断。
                        B:如果hashCode值不同,那么,这就是不同的元素。直接存储。
                          如果hashCode值相同,那么,会继续根据equals方法进行判断,
                          根据自己的需求来决定元素是否相同。如果相同,就不存储。否则,存储。

                        一般,用HashSet的时候,要重写hashCode和equals方法。
                        |--LinkedHashSet
                                底层数据结构是链表和哈希表。
                                链表用于保证元素有序,哈希表用于保证元素唯一。
                |--TreeSet
                        底层数据结构是二叉树,线程不安全。
                        如何保证元素的排序呢?两种方式
                        A:让元素本身具备比较性
                                实现Compareable接口中的compareTo方法。
                        B:让集合具备比较性
                                实现Comparator接口中的compare方法。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油!

查看全部评分

回复 使用道具 举报
对于TreeSet集合而言,它判断两个对象不相等的标准是:两个对象那个通过equals方法比较返回false或者通过compareTo(Object obj)比较没有返回0---即使两个对象时一个对象,TreeSet也会把它当成两个程序进行处理!大部分类在实现compareTo(Oject obj)方法,都需要将比较对象obj强制类型转换成相同类型,因为只有相同类的两个实例才会比较。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马