Chinaunix首页 | 论坛 | 博客
  • 博客访问: 157660
  • 博文数量: 47
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 405
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-23 14:38
文章分类

全部博文(47)

文章存档

2017年(7)

2016年(4)

2015年(19)

2014年(17)

我的朋友

分类: Java

2015-09-11 14:28:20

Set也是一个接口,继承自Collection,Set有一个特殊的性质:不保存重复的元素。那么它是如何界定重复与否呢?通过对象的euquals()方法确定元素的唯一性。对于部分Set的子类如HashSet和LinkedHashSet由于通过哈希码实现快速查找,所以需重写hashCode()方法。对于TreeSet而言,为了实现排序所以元素需要实现Compareble接口。
我们先来看看java集合给我们提供的set类。

点击(此处)折叠或打开

  1. import java.util.*;

  2. public class Main {
  3.     public static void main(String[] args) {
  4.         Main sample = new Main();
  5.         String s = "zhongguoren";
  6.         Set<Character> hashSet = new HashSet<Character>();
  7.         Set<Character> linkedHashSet = new LinkedHashSet<>();
  8.         Set<Character> treeSet = new TreeSet<>();
  9.         for(int i=0;i<s.length();i++){
  10.             hashSet.add(s.charAt(i));
  11.             linkedHashSet.add(s.charAt(i));
  12.             treeSet.add(s.charAt(i));
  13.         }
  14.         System.out.println(hashSet);
  15.         System.out.println(linkedHashSet);
  16.         System.out.println(treeSet);
  17.     }
  18. }
输出结果:
由结果可以看出首先输出里都没有重复字符,即set的特性不保存重复的元素。我们还可以看到LinkedHashSet是按元素的插入顺序保存数据的,而HashSet和TreeSet元素的顺序都发生了改变。就性能而言,HashSet和LinkedHashSet都是通过hashcode进行查找,快速查找效率较高,而TreeSet为我们给元素排序提供了方便。

点击(此处)折叠或打开

  1. import java.util.*;

  2. public class Main {
  3.     public static void main(String[] args) {
  4.         Set<Student> treeSet = new TreeSet<>();
  5.         Student[] stu = new Student[5];
  6.         stu[0]=new Student("wang",70);
  7.         stu[1]=new Student("li", 80);
  8.         stu[2]=new Student("zhang",70);
  9.         stu[3]=new Student("zhao", 90);
  10.         stu[4]=new Student("sun", 90);
  11.         for(int i=0;i<5;i++){
  12.             treeSet.add(stu[i]);
  13.         }
  14.         System.out.println(treeSet);
  15.     }
  16. }

  17. class Student implements Comparable<Student>{
  18.     String name;
  19.     int score;
  20.     @Override
  21.     public int compareTo(Student o) {
  22.         // TODO Auto-generated method stub
  23.         if(this.equals(o))
  24.             return this.score-o.score;
  25.         else
  26.             return this.score>=o.score?1:-1;
  27.     }
  28.     
  29.     public Student(String name,int score){
  30.         this.name=name;
  31.         this.score=score;
  32.     }
  33.     
  34.     public String toString(){
  35.         return name+" "+score;
  36.     }
  37.     
  38.     public boolean equals(Object o){
  39.         return o instanceof Student && this.name.equals(((Student)o).name) && this.score==((Student)o).score;
  40.     }
  41. }
输出结果:
[wang 70, zhang 70, li 80, zhao 90, sun 90]
可以看到Student类实现了comparable接口,TreeSet就是依据compareTo方法进行排序的,同时我重写了equals()方法。值得注意的一点是当我把compareTo方法直接改成return this.score-o.score后得到的输出结果为[wang 70, li 80, zhao 90]。由此可以看出TreeSet的去重复元素不仅仅是依赖于equals方法,还依赖于compareTo,当两个元素由此方法得到的结果为0时也被视为元素相等。文档中对该方法的介绍有这么一句: * <p>It is strongly recommended, but <i>not</i> strictly required that
     * <tt>(x.compareTo(y)==0) == (x.equals(y))</tt>.  Generally speaking, any
     * class that implements the <tt>Comparable</tt> interface and violates
     * this condition should clearly indicate this fact.  The recommended
     * language is "Note: this class has a natural ordering that is
     * inconsistent with equals."
同样HashSet判断元素的不重复也跟hashCode()方法有关。

阅读(1138) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~