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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾振凯 中级黑马   /  2013-3-2 14:10  /  1324 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

教程中毕老师说只要对象实现的接口Comparable中compareTo()方法返回0,则TreeSet集合会判定他是同一个对象,不会添加成功,但Set集合判段两个元素相等的依据是equals()返回true。而在TreeSet中equals()返回true,compareTo()不返回0的元素依然可以添加成功,这不是违反了Set的设计规则吗?

评分

参与人数 1技术分 +1 收起 理由
李培根 + 1 赞一个

查看全部评分

4 个回复

倒序浏览
我觉得不算吧  因为对于TreeSet而言这两个元素就是不相等的。举个例子:
  1. import java.util.*;
  2. class Z implements Comparable
  3. {
  4.         int age;
  5.         public Z(int age)
  6.         {
  7.                 this.age = age;
  8.         }
  9.         // 重写equals()方法,总是返回true
  10.         public boolean equals(Object obj)
  11.         {
  12.                 return true;
  13.         }
  14.         //重写了compareTo(Object obj)方法,总是返回正整数
  15.         public int compareTo(Object obj)
  16.         {
  17.                 return 1;
  18.         }
  19. }
  20. public class TreeSetTest2
  21. {
  22.         public static void main(String[] args)
  23.         {
  24.                 TreeSet set = new TreeSet();
  25.                 Z z1 = new Z(6);
  26.                 set.add(z1);
  27.                 //输出true,表明添加成功
  28.                 System.out.println(set.add(z1));   
  29.                 //下面输出set集合,将看到有两个元素
  30.                 System.out.println(set);
  31.                 //修改set集合的第一个元素的age变量
  32.                  ((Z)(set.first())).age = 9;
  33.                 //输出set集合的最后一个元素的age变量,将看到也变成了9
  34.                 System.out.println(((Z)(set.last())).age);
  35.         }
  36. }
复制代码
上面代码中System.out.println(set.add(z1));等于是把同一个对象再次添加
到集合中,因为z1对象的compareTo方法返回1,虽然equals方法总是返回true
但TreeSet会认为z1对象和他自己也不相等,因此TreeSet可以添加两个z1对象

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 赞一个!

查看全部评分

回复 使用道具 举报

HashSet 集合是HashCode() 和equals();
TreeSet 集合是CompareTo返回0;
Set集合只是个接口,它只有概念上的相同元素,没有具体方法。它所说的equals就是  HashSet与TreeSet的判定相同元素的标准,也就是上面的方法。
回复 使用道具 举报
{:soso_e127:},首先,楼主要明白,Comparable中compareTo() ,是用来做什么的!  
他是为了,让你自定义的类有比较性,才需要重写的,使用了TreeSet集合,添加自定义对象的时候,才需要重写,因为TreeSet,是按照自然顺序排序的,只是让他为了有序。
  楼主还忘了,一个 是先比较 Hash值。
  如果你用的是成、HashSet的话,就没有必要从写compareTo() 了!  
而在比较的时候,是先 判断对象的Hash 值,再判断equals ,哈希值相同,equals也相同。他就不添加了!  认为你应经是同一元素了!
但是,它们本来就不相同,你非要返回0。非要说,它们是相同的!  那谁也没办法啊!{:soso_e127:}

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张占忠 于 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就认为它是同一元素
就不添加了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马