黑马程序员技术交流社区

标题: 关于set的问题 [打印本页]

作者: 山水游客    时间: 2012-5-25 16:38
标题: 关于set的问题
Set里的元素是不能重复的,那么用什么方法来区分重复

作者: 张晨    时间: 2012-5-25 16:42
本帖最后由 张晨 于 2012-5-25 16:49 编辑

TreeSet
1、自定义类实现comparable接口,是自定义类实现比较功能
2、使用一个独立的实现comparator接口的类,来比较自定义类,这种方式比较灵活,所以比上面一种更常用
如果类中即实现了comparable接口又传入了comparator比较器,则比较器优先
HashSet
自定义类需要覆写,hashcode()和equals()方法,jvm先判断hashcode()是否一致,如果一直在判断equals(),如果也一致说明是同一个元素,反之则不是
作者: 揭耀祖    时间: 2012-5-25 18:48
TreeMap
java中String 、Integer....等类型都复写了compareTo()函数,跟据compareTo()函数的返回值来确定两个对象是否相等,如果返回的值为0,那么两个比较的对象就相等,如果返回值不为0那么不相等。
如果要比较自定义的对象是否相等,同样要复写这个函数,要不然没法比较。比如:
class person()
{
   private String name;
  private int age;
.......
   public int compareTo(person p)
    {
        int num = new Integer(this.age).compareTo(new Integer(p.age));   //判断年龄是否相等
           if(num==0)                                                                                  //年龄相等的话再比较名字
             {
              return   this.name.compareTo(p.name);                                   //如果名字也相等的话那么两个对象就相等了
            }
          return num;
    }
}
hashMap的原理差不多,只是比较的函数不同罢了,复写hashCode()与equals(Object obj)。

作者: 乔建国    时间: 2012-5-25 19:26
HashSet在存储元素的时候, 先调用对象的hashCode方法, 计算一个哈希值, 然后在集合中查找是否有哈希值相同的对象,  如果没有哈希值相同的对象,直接存入
如果有哈希值相同的对象, 则和哈希值相同的对象进行equals比较 , equals比较结果为false就存入,equals比较结果为true则不存,如果我们想在HashSet中存储自
定义对象, 并且去重复, 那么这个自定义的类必须重写hashCodeequals方法.
   在向TreeSet中存储元素的时候, TreeSet会使用指定的比较算法对存储元素进行排序, 内部以二叉树形式进行存储.      指定比较算法的方式:                                      
自然顺序: 在类上实现Comparable接口, 重写compareTo方法, 在方法中定义比较算法.                    
比较器顺序: 定义类实现Comparator接口, 重写compare方法, 创建比较器对象, 传入TreeSet构造函数.
如果我们想在TreeSet中存储自定义对象, 并且排序, 要么这个自定义的类实现Comparable接口, 要么在TreeSet中传入Comparator.                        
                                    
                                    
                           
                     
                           





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