Java集合源码总览(jdk1.8)
文章目录
一、集合概述
①、集合是用于存放对象的容器,通常与泛型结合使用。
必须是对象类型,泛型类型必须是对象类型,数据如果是基本类型,会被自动转换成封装类。
如int装箱成Integer。
②、集合存放的是多个对象的引用,对象本身还是放在堆内存中。
③、集合可以存放不同类型数据,是对各种数据结构和算法的封装。
二、常用集合容器
Java常用集合容器有List,Set,Map,这也是对应接口的名字。
List和Set接口又继承自Collection接口,Map接口独树一帜。
Collection接口又继承了Iterable接口,可以获得Iterator迭代器。
- Set下有HashSet,LinkedHashSet,TreeSet等
- List下有ArrayList,Vector,LinkedList、Stack等
- Map下有Hashtable,LinkedHashMap,HashMap,TreeMap等
这些是最常用的容器。
Set是一个无序,不可重复的集合
List 是有序,可以重复的集合。
Map由键值对组成,是一种映射关系。
通过List、Set、Map已经可以实现大部分的数据结构。
三、上层结构
1、Iterator迭代器
Iterable是Collection接口的父接口,该接口中有一个重要方法:
Iterator<T> iterator();
通过该方法可以Set和List可以获得迭代器,进行遍历数据。
Map没有继承Collection接口,但是其实现类中定义了相应的迭代器。
Iterator接口中有两个重要方法。
boolean hasNext();//容器是否还有元素
E next();//获取元素
2、ListIterator迭代器
List中还有一种迭代器,ListIterator。
public ListIterator<E> listIterator(int var1)
List是有序的结构,有时需要向前遍历,所以ListIterator提供了一些向前的方法。
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();//该位置前方是否还有元素
E previous();//获取前一个元素
int nextIndex();//下一个元素的索引
int previousIndex();//前一个元素的所有
void remove();//将元素从迭代器中删除
void set(E e);//修改
void add(E e);//添加
}
3、Collection集合接口
Collection是List和Set的高层父接口。
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();//转换为数组
<T> T[] toArray(T[] a);//转换为指定类型数组
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);//是否为子集
boolean addAll(Collection<? extends E> c);//将c加入集合中,求并集
boolean removeAll(Collection<?> c);//求差集
boolean retainAll(Collection<?> c);//求交集
void clear();//清空
}
还有个子类AbstractCollection,实现了部分方法。
该类又被相应的abstractSet和AbstractList继承。
4、Queue、Deque接口
队列接口和双端队列接口。
Queue继承自Collection.
Deque继承Queue.
四、重要接口
1、List
List中的元素是有序的、可重复的,主要实现方式有动态数组和链表。
List的实现主要有ArrayList、LinkedList,另外还有两个类Vector和Stack,这两个类的功能可以被其他类替代掉,CopyOnWriteArrayList是并发安全的ArrayList,属于并发包下。
ArrayList | 底层是数组、查询快、增删慢 |
LinkedList | 底层是链表,查询慢、增删块 |
CopyOnWriteArrayList | 底层是数组、和ArrayList相似,线程安全(加锁)、性能略低 |
Vector | 底层是数组、和ArrayList相似,线程安全(synchronized)、性能略低 |
Stack | 基于Vector实现的栈 |
2、Map
Map是一种(key/value)的映射结构,其它语言里可能称作字典(Dictionary),Map中的元素是一个key只能对应一个value,不能存在重复的key。
Map的实现主要有HashMap、LinkedHashMap、WeakHashMap、TreeMap、ConcurrentHashMap、ConcurrentSkipListMap,另外还有两个比较古老的Map实现HashTable和Properties。
HashMap | 底层是数组+链表+红黑树,线程不安全 |
TreeMap | 底层是红黑树,通过Key将元素排序 |
HashTable | 基本和HashMap一样,线程安全(synchronized),基本每个方法都加锁,性能低,基本被ConcurrentHashMap替代 |
LinkedHashMap | 底层和HashMap一样,只不过链表是双向链表,除了可以按照插入顺序存储外,还可以将访问顺序存储元素,性能略低于hashMap(维护双向链表) |
ConcurrentHashMap | 并发包下的HashMap,线程安全 |
3、Set
Set对应于数学概念上的集合,里面的元素是不可重复的,通常使用Map或者List来实现。
Set的实现主要有HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipSet。
HashSet | 通过HashMap的key实现 |
TreeSet | 底层是红黑树 |
LinkedHashSet | 继承自HashSet,通过LinkedHashMap实现 |