1、Set接口介绍
(1)Collection中可以存放重复元素,也可以不存放重复元素,那么我们知道List中是可以存放重复元素的。那么不重复元素给哪里存放呢?那就是Set接口,它里面的集合,所存储的元素就是不重复的;
(2)查阅Set集合的API介绍,通过元素的equals方法,来判断是否为重复元素。
2、HashSet集合介绍
(1)此类实现Set接口,由哈希表支持(实际上是一个 HashMap集合)。HashSet集合不能保证的迭代顺序与元素存储顺序相同;
(2)HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法。
3、HashSet集合存储数据的结构(哈希表)
保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。
4、HashSet存储JavaAPI中的类型元素
(1)给HashSet中存储JavaAPI中提供的类型元素时,不需要重写元素的hashCode和equals方法,因为这两个方法,在JavaAPI的每个类中已经重写完毕,如String类、Integer类等;
(2)创建HashSet集合,存储String对象。
1 public class HashSetDemo { 2 public static void main(String[] args) { 3 //创建HashSet对象 4 HashSet<String> hs = new HashSet<String>(); 5 //给集合中添加自定义对象 6 hs.add("zhangsan"); 7 hs.add("lisi"); 8 hs.add("wangwu"); 9 hs.add("zhangsan"); 10 //取出集合中的每个元素 11 Iterator<String> it = hs.iterator(); 12 while(it.hasNext()){ 13 String s = it.next(); 14 System.out.println(s); 15 } 16 } 17 }
(3)输出结果如下,说明集合中不能存储重复元素
wangwu
lisi
zhangsan
5、HashSet存储自定义类型元素
(1)给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一;
(2)创建自定义对象Student
1 public class Student { 2 private String name; 3 private int age; 4 public Student(String name, int age) { 5 super(); 6 this.name = name; 7 this.age = age; 8 } 9 public String getName() { 10 return name; 11 } 12 public void setName(String name) { 13 this.name = name; 14 } 15 public int getAge() { 16 return age; 17 } 18 public void setAge(int age) { 19 this.age = age; 20 } 21 @Override 22 public String toString() { 23 return "Student [name=" + name + ", age=" + age + "]"; 24 } 25 @Override 26 public int hashCode() { 27 final int prime = 31; 28 int result = 1; 29 result = prime * result + age; 30 result = prime * result + ((name == null) ? 0 : name.hashCode()); 31 return result; 32 } 33 @Override 34 public boolean equals(Object obj) { 35 if (this == obj) 36 return true; 37 if(!(obj instanceof Student)){ 38 System.out.println("类型错误"); 39 return false; 40 } 41 Student other = (Student) obj; 42 return this.age == other.age && this.name.equals(other.name); 43 } 44 }
(3)创建HashSet集合,存储Student对象
1 public class HashSetDemo { 2 public static void main(String[] args) { 3 //创建HashSet对象 4 HashSet hs = new HashSet(); 5 //给集合中添加自定义对象 6 hs.add(new Student("zhangsan",21)); 7 hs.add(new Student("lisi",22)); 8 hs.add(new Student("wangwu",23)); 9 hs.add(new Student("zhangsan",21)); 10 //取出集合中的每个元素 11 Iterator it = hs.iterator(); 12 while(it.hasNext()){ 13 Student s = (Student)it.next(); 14 System.out.println(s); 15 } 16 } 17 }
(4)输出结果如下,说明集合中不能存储重复元素
Student [name=lisi, age=22] Student [name=zhangsan, age=21] Student [name=wangwu, age=23]
6、LinkedHashSet介绍
(1)我们知道HashSet保证元素唯一,可是元素存放进去是没有顺序的,那么我们要保证有序,怎么办呢?
(2)在HashSet下面有一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构;
(3)演示代码如下:
1 public class LinkedHashSetDemo { 2 public static void main(String[] args) { 3 Set<String> set = new LinkedHashSet<String>(); 4 set.add("bbb"); 5 set.add("aaa"); 6 set.add("abc"); 7 set.add("bbc"); 8 Iterator it = set.iterator(); 9 while (it.hasNext()) { 10 System.out.println(it.next()); 11 } 12 } 13 }
(4)输出结果如下,说明LinkedHashSet集合保证元素的存入和取出的顺序
bbb
aaa
abc
bbc