<--
 1.Set中重复元素不会存储进来,而Map则会覆盖!!!
 2.局部内部类的使用必须在定义之后!!!
 3.<?>与<E>的区别: 是否独立使用该类型!
-->

一.Set集合
 1.什么是Set集合
  Set集合和List集合类似, 都是可以用来存储对象, 长度可变.
  Set集合和List不同的是: 没有重复元素, 没有存储顺序.
  
 2.Set集合的常用方法  添加元素:     boolean add(E e)
  删除元素:     boolean remove(Object o)
  获取长度:     int size()
  获取迭代器:     Iterator<E> iterator()
  判断是否包含:    boolean contains(Object o)
  将另一个集合中的全部添加:  boolean add(Collection<? extends E> c)
  转换成数组:     Object[] toArray()
         T[] toArray(T[] a)
  
 3.HashSet  HashSet是Set的一个实现类, 它可以做到去重复, 效率非常高.
  当我们需要把多个对象去重复的时候, 就可以使用HashSet.
  存储原理:
   使用HashSet存储对象的时候, 会先调用对象的hashCode()方法, 计算一个哈希值.
   查找集合中是否有哈希值相同的对象
    如果没有就直接存入
    如果有哈希值相同的对象, 和相同的对象逐个进行equals比较
     如果比较结果全部为false就存入
     如果比较结果包含true就不存
  用HashSet存储自定义对象:
   对象需要重写hashCode()和equals()方法
   hashCode方法要保证属性相同, 返回值相同, 属性不同尽量不同.
   equals方法要确保属性相同的返回true, 不同的返回false.
   
 4.LinkedHashSet  是HashSet的子类, 实现原理相同, 但可以保留存储顺序.
  
 5.TreeSet  TreeSet是Set的一个实现类, 可以去掉重复元素, 可以指定顺序. 按照指定的比较方式比较出元素的大小, 以二叉树形式进行存储.
  自然顺序:
   TreeSet默认按照compareTo方法中的顺序来排序.
   compareTo是Comparable接口中的抽象方法, 如果想将自定义类的对象装入TreeSet排序, 那么就需要在类上实现Comparable, 重写compareTo方法
   compareTo方法返回一个int值, TreeSet在存储对象的时候就会调用compareTo方法, 根据int值构建二叉树.
   返回的int值如果是负数就代表小于, 正数代表大于, 0代表相等.
  比较器顺序:
   在创建TreeSet的时候, 可以在构造函数中传入一个Comparator接口的实现类.
   传入Comparator之后, 再向TreeSet中添加元素时, 就会调用Comparator中的compare方法来比较了.