集合总结:
单例集合继承体系: 双例集合继承体系:
Collection<T>接口继承了Iterable<T>接口所以它的实现类可以使用迭代器进行集合元素进行遍历或者使用增强for循环进行集合元素遍历因为增强for循环的底层也是由迭代器实现的也就是说只有实现了Iterable<T>接口的类才能使用增强for循环.
迭代器通过hasNext()方法的返回值为循环判断条件(判断指针下面是存在元素),然后使用next()方法取出元素并把指针下移一位.
注意:通过迭代器遍历集合时不能使用集合的方法增加或删除集合元素不然会抛出异常ConcurrentModificationException(并发修改异常),同理增强for循环同样会抛出异常ConcurrentModificationException,解决方案是通过迭代器的删除方法删除
List<E>集合的特点是:
- 有序:即存取有序,存的顺序是什么取的顺序就是什么
- 有索引:即集合元素有索引值,可以通过索引获取集合元素也就是是说可以通过索引的方式遍历集合
- 可重复:即集合元素可以重复
- ArrayList:底层通过数组的方式实现的所以具有数组的特点即查询快,增删慢
- LinkedList:底层通过链表的方式实现的所以具备链表的特点即查询慢,增删快,同时拥有特有的对头尾元素进行增删的方法
- Vector:被ArrayList取代了
Set<E>集合的特点是:
- 无序:即存取无序,存的顺序是什么取的顺序不一定是存的顺序
- 无索引:没有索引不能通过索引获取集合元素也不能通过索引遍历集合
- 不可重复:即集合元素唯一性,通过重写hashCode()和equals()方法保证元素唯一性
- HashSet:底层通过HashMap实现,通过重写hashCode()和equals()方法保证元素唯一性
- LinkedHashSet:底层是链表所以具备链表的特性存取有序,它是Set集合唯一一个存取有序的类
- TreeSet:底层是二叉树结构,可以实现排序(自然排序或比较器排序)
集合元素排序:
- 自然排序:实现Comparable接口里的compareTo()方法
- 比较器排序:一般通过Comparator接口的匿名类重写compare()方法
- 结论:1-2升序,2-1降序
Collections的sort排序方法的实现:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
default void sort(Comparator<? super E> c) {
//把集合用toArray()方法转成Object数组
Object[] a = this.toArray();
//然后通过Arrays的sort()方法进行排序
Arrays.sort(a, (Comparator) c);
//最后通过迭代器将排序好的Object数组依次添加进集合
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
通过源码可以得知:
- Collections的sort()排序方法其实是使用的List接口中的默认sort()方法
- 而List接口中的默认sort()方法底层又是把集合转数组使用数组中的sort()方法排序,排序规则是通过传入的Comparator比较器对象实现的
- 最后通过迭代器把排序好的数组遍历添加进集合
Map<E>接口没有继承Iterable<T>接口所以它的子类不能通过迭代器遍历集合同理也不能使用增强for循环,它存储数据是通过键值映射方式存储的,拥有唯一的Key,Value可以重复
Map<K,V>集合的特点:
- 遍历方式:
- 键找值:因为实现Iterable<T>接口所以只能间接使用迭代器对map集合进行遍历
- 首先将map集合的key通过keySet()方法映射到一个Set集合
- 再使用Set集合的迭代器对key进行迭代
- 迭代过程中使用get(Object key)方法得到key所映射的value
- 键值对:通过Entry键值对对象进行遍历,该对象封装了map元素的键值映射关系
- 首先将map元素的映射关系通过entrySet()方法返回一个存储Entry键值对对象的Set集合
- 再使用Set集合的迭代器对Entry键值对对象进行迭代
- 最后使用Entry键值对对象的getkey(),getValue()获取键和值
- 键找值:因为实现Iterable<T>接口所以只能间接使用迭代器对map集合进行遍历
- HashMap<K,V>:由哈希表实现数据存储,存取无序
- LinkedHashMap<K,V>:由哈希表和链表的方式存储,存取有序
- TreeMap:由二叉树的方式存储数据会对Key进行排序,排序方式是(自然排序或比较器排序)