Java集合源码总览(jdk1.8)

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实现的栈

List

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,线程安全

Map

3、Set

Set对应于数学概念上的集合,里面的元素是不可重复的,通常使用Map或者List来实现。

Set的实现主要有HashSet、LinkedHashSet、TreeSet、CopyOnWriteArraySet、ConcurrentSkipSet。

HashSet通过HashMap的key实现
TreeSet底层是红黑树
LinkedHashSet继承自HashSet,通过LinkedHashMap实现

Set

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章