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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Miss小强 中级黑马   /  2013-4-19 09:43  /  1643 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Miss小强 于 2013-4-19 17:20 编辑

关于TreeSet如何保证元素的唯一性。。。

4 个回复

倒序浏览
他保证元素唯一性的方式是compareTo返回0表示相同,返回大于零的数表示大于,返回小于零的数表示小于;
其底层原理是二叉树,左边的是小的,右边的是
大的,他是这样保证元素的有序性,那么他是怎么保证元素的唯一性呢??
因为我在equals方法和hashCode方法上加了打印语句,同时在存的时候故意放相同的元素,只有compareTo方法调用了
我的想法:直接使用的是compareTo方法,如果compareTo方法返回值为0,则不存入;从而保证了其唯一性
那么是不是说hashCode方法和equals方法没多大作用呢。。。
回复 使用道具 举报
  1. public class Students implements Comparable<Students> {
  2.         private String name;
  3.         private int age;

  4.         public Students() {
  5.                 super();
  6.         }

  7.         public Students(String name, int age) {
  8.                 super();
  9.                 this.name = name;
  10.                 this.age = age;
  11.         }

  12.         @Override
  13.         public int compareTo(Students o) {
  14.                 System.out.println("compareTo");
  15.                 return this.name.compareTo(o.getName());
  16.         }

  17.         @Override
  18.         public int hashCode() {
  19.                 System.out.println("zhixing");
  20.                 final int prime = 31;
  21.                 int result = 1;
  22.                 result = prime * result + age;
  23.                 result = prime * result + ((name == null) ? 0 : name.hashCode());
  24.                 return result;
  25.         }

  26.         @Override
  27.         public boolean equals(Object obj) {
  28.                 System.out.println("zhixing");
  29.                 if (this == obj)
  30.                         return true;
  31.                 if (obj == null)
  32.                         return false;
  33.                 if (getClass() != obj.getClass())
  34.                         return false;
  35.                 Students other = (Students) obj;
  36.                 if (age != other.age)
  37.                         return false;
  38.                 if (name == null) {
  39.                         if (other.name != null)
  40.                                 return false;
  41.                 } else if (!name.equals(other.name))
  42.                         return false;
  43.                 return true;
  44.         }

  45.         public String getName() {
  46.                 return name;
  47.         }

  48.         public void setName(String name) {
  49.                 this.name = name;
  50.         }

  51.         public int getAge() {
  52.                 return age;
  53.         }

  54.         public void setAge(int age) {
  55.                 this.age = age;
  56.         }

  57.         public static void main(String[] args) {
  58.                 Set<Students> treeSet = new TreeSet<Students>();
  59.                 treeSet.add(new Students("xiaoqiang", 32));
  60.                 treeSet.add(new Students("xiaoqiang", 32));
  61.                 treeSet.add(new Students("xiao", 22));
  62. }
  63. }
复制代码
打印结果就只有两个compareTo。。。没有看到equals和hashCode方法的输出语句;

评分

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

查看全部评分

回复 使用道具 举报
这位兄台,这个问题老毕的视频讲的清清楚楚,明明明白。TreeSet保证元素唯一性本来就只依赖compareTo方法。只有HashSet为了保证元素的唯一性才会依赖equals和hashCode方法。Set集合下可不止一个TreeSet哦。

评分

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

查看全部评分

回复 使用道具 举报
刘渝灵 发表于 2013-4-19 11:36
这位兄台,这个问题老毕的视频讲的清清楚楚,明明明白。TreeSet保证元素唯一性本来就只依赖compareTo方法。 ...

好吧,我一下子给忘记了。。。

点评

嘿嘿,记起来就好了呀,记得改为已解决  发表于 2013-4-19 12:25
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马