标签:
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 }
标签:
原文地址:http://www.cnblogs.com/lzq1065763582/p/4636371.html