Set集合
一、感性认知:
1、对比List集合来看Set集合,感受差异化,想象距离任意情景,比较何时用List集合,何时用 Set集合。
二、理性认知:
1、集合结构图
a、java.util.Collection[I]
java.util.List[I]
java.util.ArrayList[C]
java.util.LinkedList[C]
java.util.Vector[C]
java.util.Stack[C]
java.util.Set[I]
java.util.HashSet[C]
LinkedHashSet[C]
java.util.SortedSet[I]
java.util.NavigableSet[I]
java.util.TreeSet[C]
java.util.Map[I]
java.util.SortedMap[I]
java.util.TreeMap[C]
java.util.HashTable[C]
java.util.HashMap[C]
java.util.LinkedHashMap[C]
java.util.WeakHashMap[C]
2、Set集合的存储特点
a、Set集合内部使用Map集合来存储。
b、HashSet集合,元素具有互斥性。(用代码举例)
c、HashSet集合,元素插入存储的顺序和遍历访问的数序,是不一致的。即,无序性。
e、TreeSet集合,存储其中的元素会按照compareTo比较出来的结果进行排序。
e.1、无序性:插入顺序和存储顺序不一定一致。
e.2、有序性:该集合中的元素均按照升序排列。
e.3、互斥性,与HashSet相同。
f、LinkedHashSet集合,继承自HashSet
f.1、有序性:元素的访问可以按照插入的顺序进行访问。
f.2、无序性:元素的存储顺序并不一定按照插入的顺序进行。
(PS:通过链表实现插入顺序和实际存储下标的唯一映射)
3、HashSet与LinkedHashSet比较:
a、HashSet:添加元素快。
b、LinkedHashSet:添加元素慢
(PS:LinkedHashSet额外维护了一个插入顺序的链表,消耗更多。)
4、Iterator:
即Set集合的遍历,Interator it = set.iterator();
与List集合的迭代器遍历相似。
5、Iterator与ListIterator比较:
a、前者:提供集合的迭代方法,hasNext(),next(),remove();
b、后者:提供向前向后的迭代方法,还可以返回迭代时的下标索引。
提供添加元素的方法,将元素添加至当前指针所指向的位置。
提供设置元素的方法,将当前指针所指向的位置的元素设置为指定值。
6、TreeSet排序原理:
使用CompareTo方法进行排序,如果是自定义类,那么需要让该类实现Comparable接口
如果欲实现按照某个数据升序排序TreeSet集合中的对象,那么使用:
this.field – obj.field(升序)
obj.field – this.field(降序)
7、HashSet去重原理:
a、判断添加元素的HashCode是否相同。
b、判断添加元素的equals是否相同。