Set
定义
set中不允许放入重复的元素(元素相同时只取一个)。它使用equals()方法进行比较,如果返回true,两个对象的HashCode值也应该相等。
特点:
Set接口是无序的
Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。
Set可以存储null值,但是null不能重复
Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的)。
例:
1 public class Demo02 {
2 public static void main(String[] args) {
3 Set<String> set=new HashSet<String>();
4 set.add("hello");
5 set.add("java");
6 set.add("hello");
7 for(String s:set){
8 System.out.println(s);
9 }
10 }
11 }
如图所示:

HashSet
是实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。
特点
底层数据结构是 哈希表,HashSet的本质是一个"没有重复元素"的集合,它是通过HashMap实现的。HashSet中含有一个"HashMap类型的成员变量"map,在HashSet中操作函数,实际上都是通过map实现的。
哈希表保证唯一 依赖hashcode和equals方法
存储到集合中是无序的
例:
1 //用Set对象调用add方法
2 public class Demo03 {
3 public static void main(String[] args) {
4 int str="abc".hashCode();
5 int p=new Person("小黄",18).hashCode();
6 System.out.println(p);
7 Set<Person> s=new HashSet<Person>();//重写equals和hashCode方法
8 s.add(new Person("小黑",18));
9 s.add(new Person("小黑",18));
10 s.add(new Person("lao黑",19));
11 for(Person a:s){
12 System.out.println(a);//没有重复元素
13 }
14 }
15 }
如图所示:

LinkeHashSet
底层数据结构是 链表和哈希表
链表保证元素有序
哈希表保证元素唯一
例:
1 public class Demo04 {
2 public static void main(String[] args) {
3 LinkedHashSet<String> set=
4 new LinkedHashSet<String>();
5
6 set.add("hello");
7 set.add("java");
8 set.add("hello");
9 set.add("java");
10 //遍历
11 for(String s:set){
12 System.out.println(s);
13 }
14 }
15 }
如图所示:

Set集合和List集合的区别?
Set: 不允许元素重复, 集合元素唯一(元素可以为null), 不能保证迭代顺序恒久不变, 无序(存储和取出不一致).
List: 允许元素重复, 并且元素有序(存储和取出一致).