JAVA基础2-JAVA集合学习笔记

初级篇

结构图

JAVA基础2-JAVA集合学习笔记
JAVA基础2-JAVA集合学习笔记

关键点

List、Set和Map的区别

1、List(有序、可重复)
List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。
2、Set(无序、不能重复)
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
3、Map(键值对、键唯一、值不唯一)
Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
对比如下:

接口 实现类 是否有序 是否允许元素重复
Collection
List
Set AbstractSet
HashSet
TreeSet 是(用二叉排序树)
Map AbstractMap 使用key-value来映射和存储数据,key必须唯一,value可以重复
HashMap
TreeMap

获取元素方法

add和remove,在当前增加或删除元素。(队列一样)。
push和pop,是堆栈形式,先进后出。
offer和poll,是队列形式,先进先出。
peek获取当前的元素。
take获取当前元素,但是有阻塞功能。

具体说明

Collection 继承Iterable接口,由iterator构成的接口。主要定义一些集合基本方法,包括添加元素(add)、移除元素(remove)、集合数量(size)、是否包含某个元素或者集合(contains)、清除元素(clear)、获取元素(iterator)等等。

AbstractCollection实现了Collection接口的抽象类,实现isEmty、contains、toArray、add、remove、containsAll、retainAll、clear等方法。

List有序,可重复,继承Collection接口。由于是有序的,会增加一些index的方法,比如add(int,object)、get、set、SubList(获取列表某一段子列表,对子列表操作会影响父列表)、indexOf、lastIndexOf等。

AbstractList 继承AbstractCollection抽象类实现List接口,除了继承AbstractCollection的方法外,实现了List接口的一些方法,比如add、get、set、SubList(获取列表某一段子列表,对子列表操作会影响父列表)、indexOf、lastIndexOf、removeRange等。

Vector继承AbstractList抽象类并实现List接口,主要是动态数组,同时实现线程安全的类。几个重要的属性elementCount(数据数量,默认10)、capacityIncrement(数组超出,每次增加数量,默认2倍)。除了原先AbstractList的方法外,增加了自身一些操作lastIndex(Object,int)、elementAt、firstElement、lastElement、setElement、removeElement等,这些方法与原先的add、set、get的方法有类似作用。

Stack继承Vector,主要实现堆栈效果,后进先出,也实现线程安全。增加了堆栈的一些方法,push、pop和peek等方法

ArrayList继承AbstractList抽象类并实现List接口,主要是动态数组,非线程安全。重要的属性elementCount(数据数量,默认10),每次增加50%。与Vector基本一致,只是线程问题不同而已。

AbstractSequentialList继承AbstractList抽象类,主要用于按次序访问list,主要方法是实现其listIterator(in)接口。

LinkedList继承AbstractSequentialList抽象类实现List和Deque接口,属于链表结构,非线程安全。与不同之处在于一些性能,比如增加删除会快于ArrayList,而获取某一个元素则比ArrayList慢。实现Deque接口的一些方法,如:addFirst、addLast、peek、poll、pop、offer等链表式操作

Set无序、不可重复的的接口,继承Collection接口。原封不动继承了Collection的一些方法。

AbstractSet继承AbstractCollection抽象类并实现Set接口,主要是为了区分Set接口功能特点(不可重复),重新定义了equal、hashCode、removeAll方法。

HashSet继承AbstractSet抽象类并实现Set接口,主要使用HashMap(数组结构)存储,实现Set接口的一些操作方法,如add、iterator、size、contains、isEmpty、remove、clear等。

LinkedHashSet继承HashSet类并实现Set接口,主要使用LinkedHashMap(链式结构)存储。与HashSet最大不同是按照元素插入的顺序进行迭代,即迭代输出的顺序与插入的顺序保持一致。

SortedSet继承Set接口,特点变成有序,添加了一些方法如:comparator、subSet、headSet、tailSet、first、tail方法。

NavigableSet继承SortedSet接口,增加了一些navigable的方法,如:lower、floor、ceiling、higher、pollFirst、pollLast、descendingSet等方法。

TreeSet继承AbstractSet抽象类并实现NavigableSet接口,主要使用TreeMap(二叉树结构)存储,实现了NavigableSet接口的一些操作方法,比如:lower、floor、ceiling、higher、pollFirst、pollLast、descendingSet等方法。

Queue继承Collection接口,序列定义一些方法,如poll、peek、offer方法。

Deque继承Queue接口,增加了一些first和last的操作。

ArrayDeque继承AbstractCollection并实现Deque接口,使用数组结构,并实现Collection接口和Deque接口的方法。与LinkedList的区别在于,ArrayDeque是双向队列。

Map无序,key不能重复的接口。定义map的操作,如:get、put、remove、keySet、entrySet、valueSet、size、contains等。

AbstractMap实现Map接口,实现一些基本map方法,如:get、put、remove、keySet、entrySet、valueSet、size、contains等。

HashMap继承AbstractMap抽象类并实现Map接口,属于数组结构,实现具体的方法。

LinkedHashMap继承HashMap,属于链式结构,实现具体的方法。与HashMap最大不同是按照元素插入的顺序进行迭代,即迭代输出的顺序与插入的顺序保持一致。

SortedMap继承Map接口,特点变成有序,并增加一些方法,如:comparator、entrySet、headMap、tailMap、firstKey、lastKey、subMap方法。

NavigableMap继承SortedMap接口,增加了一些navigable的方法,如:lowerKey/Entry、floorKey/Entry、ceilingKey/Entry、higherKey/Entry、pollFirstKey/Entry、pollLastKey/Entry、descendingMap等方法。

TreeMap继承AbstractMap抽象类实现NavigableMap接口,属于二叉树结构,实现NavigableMap接口的一些方法,比如:lowerKey/Entry、floorKey/Entry、ceilingKey/Entry、higherKey/Entry、pollFirstKey/Entry、pollLastKey/Entry、descendingMap等方法。

Hashtable继承Dictionary抽象类实现Map接口,属于数组结构,同时实现线程安全。与HashMap基本一致,只是线程安全不同而已,不能接受key和value为null的,。

WeakHashMap继承AbstractMap抽象类并实现Map接口。弱化的Map,会自动回收数据,主要用于缓存。

IdentityHashMap继承AbstractMap抽象类并实现Map接口。允许存在2个相同key(内容相同,地址不同)的Map。与HashMap最大的不同是使用key获取数据,IdentityHashMap用的是地址而不是内容。

主要区别

Vector与ArrayList

Vector与ArrayList都是数组结构,但是vector是线程安全,arrayList是非线程安全。
ArrayList与LinkedList
ArrayList是数组结构,而LinkedList是链式结构,在频繁新增和删除上面,LinkedList有优势。而在读取某一个元素ArrayList有优势。

List与Set

List是有序,可重复元素的,Set是无序,不可重复元素的。

Set与SortedSet

SortedSet继承Set,并增加有序功能。
HashSet、LinkedHashSet和TreeSet
HashSet是数组结构,无序;LinkedHashSet是链式结构,有序,如何进入如何出来;TreeSet是二叉树结构,有序,自动排序,默认从小到大排序(可以定义Comparator来排序)

HashMap、LinkedMap和TreeMap

HashMap是数组结构,无序;LinkedHashMap是链式结构,有序,如何进入如何出来;TreeMap是二叉树结构,有序,自动排序,默认从小到大排序(可以定义Comparator来排序)

HashMap与Hashtable

HashMap是非线程安全,Hashtable是线程安全的。

HashMap与IdentityHashMap

HashMap的key如果内容相同,则代表同一个可以。IdentityHashMap的key必须是地址相同才代表同一个key,这样可以实现假象存在2个相同key的map。

关于Collection的synchronized

在collection中定义许多synchronized的修饰方法和类,如Collections.synchronizedMap()、
synchronizedList() 和 synchronizedSet()等。主要用于线程安全。

高级篇

结构图

JAVA基础2-JAVA集合学习笔记
JAVA基础2-JAVA集合学习笔记

关键点

抛异常 特定值 阻塞 超时
插入 add(o) offer(o) put(o) offer(o, timeout, timeunit)
移除 remove(o) poll(o) take(o) poll(timeout, timeunit)
检查 element(o) peek(o)

四组不同的行为方式解释:

  1. 抛异常:如果试图的操作无法立即执行,抛一个异常。
  2. 特定值:如果试图的操作无法立即执行,返回一个特定的值(常常是 true / false)。
  3. 阻塞:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行。
  4. 超时:如果试图的操作无法立即执行,该方法调用将会发生阻塞,直到能够执行,但等待时间不会超过给定值。返回一个特定值以告知该操作是否成功(典型的是 true / false)。

具体说明

BlockingQueue继承AbstractQueue抽象类并实现BlockingQueue接口,增加一些阻塞定义方法offer、poll、take,与原先的offer、poll不一样是增加阻塞功能。

ArrayBlockingQueue继承AbstractQueue抽象类并实现BlockingQueue接口,属于数组结构,初始化时固定数量。实现BlockingQueue的一些方法。

LinkedBlockingQueue继承AbstractQueue抽象类并实现BlockingQueue接口,属于链式结构,可以无限增长数量。实现BlockingQueue的一些方法。

PriorityBlockingQueue继承AbstractQueue抽象类并实现BlockingQueue接口,属于数组结构,底层存放数据使用PriorityQueue,可以无限增长数量。具有自动排序功能,但是元素必须实现Comparable接口。注意:使用iterator方法获取数据不能保证一定有排序功能。

SynchronousQueue继承AbstractQueue抽象类并实现BlockingQueue接口。此队列只能保存一个数据。

DelayQueue继承AbstractQueue抽象类并实现BlockingQueue接口,属于数组结构,底层存放数据使用PriorityQueue。具有延迟效果,但是元素必须实现Delayed接口,如果接口getDelayed返回0或者负数,下次take将会被释放。其中Delayed接口还继承Comparable接口,用于比较优先级被释放。

BlockingDeque继承Deque和BlockingQueue接口。双向队列,具有Deque功能的阻塞队列。增加push和pop方法,实现堆栈功能。

LinkedBlockingDeque实现BlockingDeque接口。属于链式结构,实现BlockingDeque接口的方法。

ConcurrentLinkedQueue继承AbstractQueue接口,实现线程安全,链式结构。

ConcurrentMap继承Map接口。增加replace方法。继承此类的子类都实现线程安全。

ConcurrentHashMap继承AbstractMap抽象类并实现ConcurentMap接口。与HashTable提供一样功能的线程安全,但是效率比HashTable高。

ConcurrentNavigableMap继承SortMap接口,与NavigableMap功能一样,但是增加线程安全。

ConcurrentSkipListMap继承ConcurrentMap和ConcurrentNavigableMap接口。实现线程安全,和链表式结构,而且是有序的。

ConcurrentSkipListSet继承AbstractSet并实现NavigableSet接口。实现线程安全,和链式接口,并且有序的,不重复。内部主要使用ConcurrentSkipListMap实现。

CopyOnWriteArrayList继承List接口。实现并发机制线程安全。但是不能保证读取的实效性。

CopyOnWriteArraySet继承Set接口。实现并发机制线程安全。但是不能保证读取的实效性。

主要区别

BlockingQueue与Queue

BlockingQueue实现了阻塞功能,增加一些阻塞定义方法offer、poll、take。

为什么有Concurrent包

关于线程安全,在原始的java.lang包中已经包含Vertor和Hashtable,Collections的同步封装工厂也可以实现线程安全,但是为什么还需要concurrent。这个与迭代和并发修改之间的交互有关,如果在迭代过程中任何其他线程修改 List,迭代可能失败。如果迭代线程采用复制或者锁定列表,那么对性能影响很大。

ConcurrentLinkedQueue与LinkedList

ConcurrentLinkedQueue实现线程安全。

ConcurrentMap与Map

ConcurrentMap实现线程安全,增加replace方法。ConcurrentMap采用分段存储,减少并发锁等待。

ConcurrentSkipListMap与ConcurrentHashMap

ConcurrentSkipListMap是链式结构,并且有序。而ConcurrentHashMap是无序,数组结构。