黑马程序员技术交流社区
标题:
关于Treeset
[打印本页]
作者:
贾振凯
时间:
2013-3-2 14:10
标题:
关于Treeset
教程中毕老师说只要对象实现的接口Comparable中compareTo()方法返回0,则TreeSet集合会判定他是同一个对象,不会添加成功,但Set集合判段两个元素相等的依据是equals()返回true。而在TreeSet中equals()返回true,compareTo()不返回0的元素依然可以添加成功,这不是违反了Set的设计规则吗?
作者:
Gaara
时间:
2013-3-2 14:30
我觉得不算吧 因为对于TreeSet而言这两个元素就是不相等的。举个例子:
import java.util.*;
class Z implements Comparable
{
int age;
public Z(int age)
{
this.age = age;
}
// 重写equals()方法,总是返回true
public boolean equals(Object obj)
{
return true;
}
//重写了compareTo(Object obj)方法,总是返回正整数
public int compareTo(Object obj)
{
return 1;
}
}
public class TreeSetTest2
{
public static void main(String[] args)
{
TreeSet set = new TreeSet();
Z z1 = new Z(6);
set.add(z1);
//输出true,表明添加成功
System.out.println(set.add(z1));
//下面输出set集合,将看到有两个元素
System.out.println(set);
//修改set集合的第一个元素的age变量
((Z)(set.first())).age = 9;
//输出set集合的最后一个元素的age变量,将看到也变成了9
System.out.println(((Z)(set.last())).age);
}
}
复制代码
上面代码中System.out.println(set.add(z1));等于是把同一个对象再次添加
到集合中,因为z1对象的compareTo方法返回1,虽然equals方法总是返回true
但TreeSet会认为z1对象和他自己也不相等,因此TreeSet可以添加两个z1对象
作者:
lzw123451
时间:
2013-3-2 14:42
HashSet 集合是HashCode() 和equals();
TreeSet 集合是CompareTo返回0;
Set集合只是个接口,它只有概念上的相同元素,没有具体方法。它所说的equals就是 HashSet与TreeSet的判定相同元素的标准,也就是上面的方法。
作者:
张占忠
时间:
2013-3-2 14:49
{:soso_e127:},首先,楼主要明白,Comparable中compareTo() ,是用来做什么的!
他是为了,让你自定义的类有比较性,才需要重写的,使用了TreeSet集合,添加自定义对象的时候,才需要重写,因为TreeSet,是按照自然顺序排序的,只是让他为了有序。
楼主还忘了,一个 是先比较 Hash值。
如果你用的是成、HashSet的话,就没有必要从写compareTo() 了!
而在比较的时候,是先 判断对象的Hash 值,再判断equals ,哈希值相同,equals也相同。他就不添加了! 认为你应经是同一元素了!
但是,它们本来就不相同,你非要返回0。非要说,它们是相同的! 那谁也没办法啊!{:soso_e127:}
作者:
张占忠
时间:
2013-3-2 14:56
本帖最后由 张占忠 于 2013-3-2 14:59 编辑
张占忠 发表于 2013-3-2 14:49
,首先,楼主要明白,Comparable中compareTo() ,是用来做什么的!
他是为了,让你自定义 ...
还有楼主,Set是接口, 无法创建对象的,只能使用,HashSet 或者 threeSet。
去掉重复元素,的比较是hash值,在比较equals,如果hash值为true ,就不比较equals 了,认为相同元素就不添加了!
如果hash值比较为false,了在比较,equals ,如果equals 为true 的话,threeSet就认为它是同一元素
就不添加了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2