黑马程序员技术交流社区
标题: 关于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中存储自
定义对象, 并且去重复, 那么这个自定义的类必须重写hashCode和equals方法.
在向TreeSet中存储元素的时候, TreeSet会使用指定的比较算法对存储元素进行排序, 内部以二叉树形式进行存储. 指定比较算法的方式:
自然顺序: 在类上实现Comparable接口, 重写compareTo方法, 在方法中定义比较算法.
比较器顺序: 定义类实现Comparator接口, 重写compare方法, 创建比较器对象, 传入TreeSet构造函数.
如果我们想在TreeSet中存储自定义对象, 并且排序, 要么这个自定义的类实现Comparable接口, 要么在TreeSet中传入Comparator.
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |