深入理解Java集合体系
- 集合体系其实一共分为两大块儿:Collection和Map,他们都与Iterator相关联
1, Collection(单值)
Collection是一个接口,实现了Iterable接口,意味着所有实现Collection的类都将实现Iterator方法,他们都能生成自己的迭代器。并使用foreach遍历。
Collection中的主要抽象方法 | 说明 |
---|
boolean add(E e) | 添加 |
boolean remove(Object o) | 删除 |
boolean contains(Object o) | 是否包含 |
Object[] toArray() | 将集合中元素转化为数组 |
void clear() | 清空集合 |
int size() | 元素个数 |
Iterator < E> iterator | 迭代器 |
- 抽象类AbstractCollection部分实现了Collection中的一些方法,所有继承AbstractCollection的类中都将同时具备这些方法,他们是抽象类AbstractList,AbstractSet。
- 继承Collection接口的有三个分支接口,分别是List, Queue, Set,他们在继承原有的Collection中的方法的同时,按照自己的特性,增加了一些需要实现的新方法。
1.1 Vector,ArrayList与(AbstractSequentialList->)LinkedList
这三个具体类都实现了AbstractList抽象类,用法接近。
- Vector使用率远远低于ArrayList,Vector处理同步问题时不如ArrayList。用法与ArrayList相似。
- ArrayList可以理解为一个数组,但是比数组更方便,具有数组存储方法的所有优点,按下标随机访问元素,还能动态扩容,但是增删不方便。
- LinedList稍微有点特殊,它并不直接继承AbstractList,先继承AbstractSequentialList,而前者再继承AbstractList,LinkedList实现了Deque接口,这说明LinkedList可以模拟双端队列,并且它的插入是有序的,不支持随机访问,但增删非常方便。
1.2 HashSet,LinkedHashSet与TreeSet
这三个具体类都实现了AbstractSet抽象类,用法接近
- HashSet在实现原理上来说,其实就是利用了HashMap的键,而将HashMap对应的值设置为常量,HashSet中元素不重复且插入无序
- LinkedHashSet继承了HashSet,拥有HashSet的所有方法,改动不多,但是额外实现了插入有序的方法,所以LinkedHashSet在插入时是有序的。
- TreeSet又稍微有点不同,它除了直接实现AbstractSet,还实现了NavigableSet接口,而前者实现了SortedSet接口,而SortedSet接口才实现了Set接口,它支持排序操作,默认按照自然语言顺序排序,也可以在自定义类中实现自定义排序方法。
1.3 Queue的用法比较少,BlockingQueue,PriorityQueue,LinkedList均实现了Queue接口。
2, Map(双值映射)
Map是一个接口,对于实现它的具体类,可以将其理解为一个键值对,一个键映射一个值
Map中的主要抽象方法 | 说明 |
---|
V put(K key, V value) | 添加键值对,不重复返回null,重复返回被覆盖的值 |
V remove(Object key) | 删除键值对,找到键,即可删除整个对子 |
boolean containsKey(Object key) | 是否包含某个键 |
Set< K> keySet() | 生成此map的键集合,这样就可以用Iterator遍历了 |
void clear() | 清空map所有元素 |
Set<Map.Entry<K, V>> entrySet() | 生成类型为Entry<K, V>的集合Set,也可以用来遍历 |
2.1 HashMap,LinkedHashMap与TreeMap
- HashMap继承了AbstractMap,最常用,插入无序,
- LinkedHashMap继承HashMap,除了增加一些构造方法,实现了额外的序列函数,其他用法一样,但是它的插入是有序的。
- TreeMap除了直接继承AbstractMap,还实现了NavigableMap接口,而NavigableMap接口又实现了SortedMap,SortedMap最终继承Map。TreeMap和HashMap用法依然相似,但是默认按照自然语言顺序排序,并可以自定义排序方法。
3, Iterator(迭代器)
迭代器用于Collection单值集合,可以使用迭代器遍历Collection集合。且支持foreach遍历。迭代器一旦生成,最开始什么也不指,但是它即将指向集合的第一个元素。
Iterator主要抽象方法 | 说明 |
---|
boolean hasNext() | 判断是否有下一个元素 |
E next() | 指向下一个元素 |
void remove() | 删除当前指针指向的元素 |
ArrayList<String> list = new ArrayList<>();
Iterator iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
4, Collections 与 Arrays
- Collections是一个具体类,提供了操作集合的一系列方法。可以自行ctrl+鼠标左键查看具体用法。
- Arrays也是一个具体类,提供了操作数组的一系列方法。
- 相互转化:
String strs[] = {"1", "2"};
Arrays.asList(strs) //将其一个返回List类型的列表
ArrayList<String> list = new ArrayList<>();
list.toArrays() //将返回String类型的数组