从零开始的Java容器学习(一):初窥容器

前言

写这系列文章是为了一边学习一边总结,初次写文,若有错谬欢迎各位批评指正。java

若是没有特别说明,源码部分均是JDK1.8数组

容器接口简介

简略版容器框架图

容器框架图

容器,指用来存放对象的工具。容器主要包括两种,分别是Collection和Map,Collection用于存放对象,它的实现主要有List和Set,而Map用来存储键值对的映射表。安全

容器类的部分方法

boolean add(E e);//增长元素e
boolean remove(Object o);//删除元素o
void clear();//删除全部元素
boolean contains(Object o);//断定是否包含元素o
boolean isEmpty();//判断容器是否为空
int size();//返回容器内包含的元素数量
Object[] toArray();//返回一个包含此集合中全部元素的数组
Iterator<E> iterator();//返回此集合中的元素的迭代器
复制代码

固然还有其余的一些方法,由于篇幅问题省略了。并发

下面简要介绍一下容器框架内的一些重要实现框架

List、Set和Map的主要区别

List是有序列表,可重复。工具

Set是无序集合,不可重复。性能

Map用于存储键值对映射,提供从key到value的映射,key不可重复。学习

List的主要实现类

ArrayList:基于数组实现,无容量限制,在执行插入元素时可能要扩容,在删除元素时并不会减少容量,在查找元素时要遍历数组,对于非null的元素采起equals的方式寻找,非线程安全。优缺点:查找快,插入删除效率低spa

LinkedList:基于双向链表机制,在插入元素时,须建立一个新的Entry对象,并切换相应元素的先后元素的引用;在查找元素时须遍历链表;在删除链表时,找到要删除的元素而后在链表上删除便可,非线程安全。优缺点:插入删除快,查找慢线程

Vector:基于 synchronized 实现的线程安全的 ArrayList,但在插入元素时容量扩充的机制和 ArrayList稍有不一样,并可经过传入 capacityIncrement 来控制容量的扩充,线程安全

Stack:基于Vector实现,支持 LIFO,线程安全

Set主要实现类

HashSet:基于HashMap实现,无容量限制,非线程安全。

TreeSet:基于TreeMap实现,支持排序(天然排序 或者 根据建立TreeSet 时提供的 Comparator 进行排序),非线程安全。

LinkedHashSet:继承自HashSet底层是LinkedHashMap,优势是能够保证元素顺序,即遍历序和插入序是一致的。

BitSet:位操做的对象,值只有0或1即false和true,其内部维护了一个 long 数组

Map主要实现类

HashMap:基于哈希表实现,底层是数组和链表/红黑树,是无序的键值对集合,非线程安全

HashTable:基于哈希表实现,用链表解决冲突,线程安全

LinkedHashMap:在HashMap的基础上使用环形双向链表保证key的顺序,优势是能够保持插入的顺序和访问顺序(LRU)非线程安全

TreeMap:基于红黑树实现,优势是支持排序非线程安全

ConcurrentHashMap:基于CAS+synchronized的HashMap,底层是数组和链表/红黑树,线程安全

其余的一些容器类

CopyOnWrite类容器类:线程安全,适合读多写少场景,容许并发读,无锁操做因此性能高,写操做是写以前将容器复制一份,在新的副本上执行写操做而后再将原容器引用指向新容器。

Queue:队列,具体实现有ArrayDeque、PriorityQueue等等。

Collection和Collections的区别

Collection是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操做的通用接口方法。Collection接口在Java类库中有不少具体的实现。Collection接口的意义是为各类具体的集合提供了最大化的统一操做方式,其直接继承接口有List与Set。

Collections是一个包装类(工具类/帮助类)。它包含有各类有关集合操做的静态多态方法。此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各类操做,服务于Java的Collection框架。

参考:

乔戈里面经

这篇文章让你完全掌握Java集合框架!

相关文章
相关标签/搜索