1.Set接口概述
Set 不保存重复的元素(如何判断元素相同呢?)。如果你试图将相同对象的多个实例添加到Set中,那么它就会阻止这种重复现象。 Set中最常被使用的是测试归属性,你可以很容易地询问某个对象是否在某个Set中。 正因如此,查找就成为了Set中最重要的操作,因此你通常都会选择一个HashSet 的实现,它专门对快速查找进行了优化。
Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为)。Set 是基于对象的值来确定归属性的。
java.util Interface Set<E> |
|
2.Set常用实现类
(1)HashSet
HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口。由哈希表支持(实际上是一个HashMap实例,基于
HashMap来实现的,底层采用HashMap来保存元素。),天生就是为了提高查找效率的。
构造方法 |
所有方法 |
(2)TreeSet
TreeSet 继承AbstractSet类,实现NavigableSet、Cloneable、Serializable接口。与HashSet是基于HashMap实现一样,TreeSet 同样是基于TreeMap 实现的。由于得到Tree 的支持,TreeSet 最大特点在于排序,它的作用是提供有序的Set集合。
|
构造方法 |
常用方法 |
(3)LinkedHashSet
LinkedHashSet 综合了链表+哈希表,根据元素的hashCode值来决定元素的存储位置,它同时使用链表维护元素的次序。
当遍历该集合时候,LinkedHashSet 将会以元素的添加顺序访问集合的元素。
对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。
public class LinkedHashSet<E> extends HashSet<E> 参数类型E ---由此集合维护的元素的类型
|
构造方法 |
方法(基本都是继承方法) |
3.set演示
(1)HashSet
1 public class HashSetDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 //1,创建一个Set容器对象。 9 Set set = new HashSet();//如果该成LinkedHashSet,可实现有序。 10 11 //2,添加元素。 12 set.add("abc"); 13 set.add("nba"); 14 set.add("heihei"); 15 set.add("haha"); 16 set.add("heihei"); 17 18 //3,只能用迭代器取出。 19 for (Iterator it = set.iterator(); it.hasNext();) { 20 System.out.println(it.next()); 21 } 22 23 } 24 25 } 26
(2)TreeSet
1 public class TreeSetDemo2 { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 //初始化TreeSet集合明确一个比较器。 9 Set set = new TreeSet(new ComparatorByName()); 10 11 set.add(new Student("xiaoqiang",20)); 12 set.add(new Student("daniu",24)); 13 set.add(new Student("xiaoming",22)); 14 set.add(new Student("tudou",18)); 15 set.add(new Student("daming",22)); 16 set.add(new Student("dahuang",19)); 17 18 for (Iterator it = set.iterator(); it.hasNext();) { 19 Student stu = (Student)it.next(); 20 System.out.println(stu.getName()+"::"+stu.getAge()); 21 } 22 } 23 24 } 25 /**/ 26 * 自定义一个比较器,用来对学生对象按照姓名进行排序。 27 * @author Administrator 28 * 29 */ 30 public class ComparatorByName extends Object implements Comparator { 31 32 @Override 33 public int compare(Object o1, Object o2) { 34 35 Student s1 = (Student)o1; 36 Student s2 = (Student)o2; 37 38 int temp = s1.getName().compareTo(s2.getName()); 39 40 return temp==0?s1.getAge()-s2.getAge():temp; 41 } 42 43 } 44 / 45 public class Student implements Comparable { 46 47 private String name; 48 private int age; 49 50 public Student() { 51 super(); 52 53 } 54 public Student(String name, int age) { 55 super(); 56 this.name = name; 57 this.age = age; 58 } 59 60 61 62 /** 63 * 覆盖hashCode方法。根据对象自身的特点定义哈希值。 64 */ 65 public int hashCode(){ 66 final int NUMBER = 37; 67 return name.hashCode() + age*NUMBER; 68 } 69 70 /** 71 * 需要定义对象自身判断内容相同的依据。覆盖equals方法。 72 * 73 */ 74 public boolean equals(Object obj){ 75 76 if(this == obj){ 77 return true; 78 } 79 80 if(!(obj instanceof Student)){ 81 throw new ClassCastException("类型错误"); 82 } 83 84 Student stu = (Student)obj; 85 86 return this.name.equals(stu.name)&& this.age == stu.age; 87 } 88 89 public String getName() { 90 return name; 91 } 92 public void setName(String name) { 93 this.name = name; 94 } 95 public int getAge() { 96 return age; 97 } 98 public void setAge(int age) { 99 this.age = age; 100 } 101 @Override 102 public String toString() { 103 return "Student [name=" + name + ", age=" + age + "]"; 104 } 105 /** 106 * 学生就具备了比较功能。该功能是自然排序使用的方法。 107 * 自然排序就年龄的升序排序为主。 108 */ 109 @Override 110 public int compareTo(Object o) { 111 112 Student stu = (Student)o; 113 // System.out.println(this.name+":"+this.age+"........"+stu.name+":"+stu.age); 114 /* 115 if(this.age>stu.age) 116 return 1; 117 if(this.age<stu.age) 118 return -1; 119 return 0; 120 */ 121 122 /* 123 * 既然是同姓名同年龄是同一个人,视为重复元素,要判断的要素有两个。 124 * 既然是按照年龄进行排序。所以先判断年龄。在判断姓名。 125 */ 126 int temp = this.age - stu.age; 127 128 return temp==0?this.name.compareTo(stu.name):temp; 129 130 } 131 132 133 } 134
2018-01-05
内容来自API1.8、Java编程思想、传智播客课程