Set接口
关于Set接口,在上课时总是很少提到,所以对它的认识并不多,实现set接口的类,里面的元素没有重复的。他依赖于map,其实我们保存的值,是保存的key,在map中,key不会重复,所以set也就没有重复的元素,它的实现类有三个:HashSet,TreeSet,LinkedHashSet.
1 public static void main(String[] args) { 2 //Set<Integer> set = new HashSet<Integer>(); 3 // Set<Integer> set = new TreeSet<Integer>(); 4 Set<Integer> set = new LinkedHashSet<Integer>(); 5 set.add(null); 6 Random rd = new Random(); 7 System.out.println("添加顺序:"); 8 for (int i = 0; i < 20; i++) { 9 int x = rd.nextInt(30);10 set.add(x);11 System.out.print(x + ",");12 }13 System.out.println();14 15 System.out.println("遍历顺序:");16 Iterator iterator = set.iterator();17 while(iterator.hasNext()){18 System.out.print(iterator.next() + ",");19 }20 }
HashSet:他是无序的,可以保存null,添加顺序和遍历结果如下:
LinkedHashSet:他保持了元素的添加顺序,可以保存null,添加顺序和遍历结果如下:
TreeSet:他是一个有序集合,元素按照顺序排列,但是不能保存null,添加顺序和遍历结果如下:
我们自己定义的类,如果要加入到TreeSet中,需要实现接口Comparable 中的compareTo方法 ,定义自己的比较规则,否则会抛出一个异常。
给个Demo,自定义的规则是先比较int,再比较string,无论Model1,Model2,Model3的添加顺序怎么变,输出都是一样的, eg:
1 public class Model implements Comparable { 2 String str; 3 int num; 4 @Override 5 public int compareTo(Object arg0) { 6 Model tmp = (Model)arg0; 7 int cmp = this.num - tmp.num; 8 if(cmp == 0){ 9 return str.compareTo(tmp.str);10 }11 return cmp;12 }13 }14 15 public static void main(String[] args) {16 TreeSet<Model> ts = new TreeSet<Model>();17 Model m2 = new Model();18 m2.str = "121";19 m2.num = 1;20 ts.add(m2);21 22 Model m3 = new Model();23 m3.str = "121";24 m3.num = 2;25 ts.add(m3);26 27 Model m1 = new Model();28 m1.str = "321";29 m1.num = 1;30 ts.add(m1);31 32 Iterator<Model> it = ts.iterator();33 while(it.hasNext()){34 Model tmp = it.next();35 System.out.println(tmp.str + ":" + tmp.num);36 }37 }