黑马程序员技术交流社区

标题: 关于 集合框架的一些小疑问,高手进 [打印本页]

作者: Miss小强    时间: 2013-4-19 09:43
标题: 关于 集合框架的一些小疑问,高手进
本帖最后由 Miss小强 于 2013-4-19 17:20 编辑

关于TreeSet如何保证元素的唯一性。。。
作者: Miss小强    时间: 2013-4-19 09:46
他保证元素唯一性的方式是compareTo返回0表示相同,返回大于零的数表示大于,返回小于零的数表示小于;
其底层原理是二叉树,左边的是小的,右边的是
大的,他是这样保证元素的有序性,那么他是怎么保证元素的唯一性呢??
因为我在equals方法和hashCode方法上加了打印语句,同时在存的时候故意放相同的元素,只有compareTo方法调用了
我的想法:直接使用的是compareTo方法,如果compareTo方法返回值为0,则不存入;从而保证了其唯一性
那么是不是说hashCode方法和equals方法没多大作用呢。。。
作者: Miss小强    时间: 2013-4-19 09:50
  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方法的输出语句;
作者: 刘渝灵    时间: 2013-4-19 11:36
这位兄台,这个问题老毕的视频讲的清清楚楚,明明明白。TreeSet保证元素唯一性本来就只依赖compareTo方法。只有HashSet为了保证元素的唯一性才会依赖equals和hashCode方法。Set集合下可不止一个TreeSet哦。
作者: Miss小强    时间: 2013-4-19 12:14
刘渝灵 发表于 2013-4-19 11:36
这位兄台,这个问题老毕的视频讲的清清楚楚,明明明白。TreeSet保证元素唯一性本来就只依赖compareTo方法。 ...

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




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