Java基础之--集合

Java基础之集合类:


a.作用:负责保存和盛装其他数据,又称容器类
* 用于存储数量不等的对象,并可实现常用的数据结构,如栈,队列等;
* 用于保存具有映射关系的关联数组;

和数组的区别
1).数组元素可以是基本类型,也可以是对象;
2).集合只能是对象;

b.体系结构:大致可分为SetListQueueMap四种体系。

* Set:代表**无序,不可重复**的集合;
* List:代表**有序,可重复**的集合
* Map:代表具有**映射关系**的集合;
* Queue:代表一种**队列**集合;

Java基础之--集合

JAVA集合类之间的关系图

Java基础之--集合

主要介绍图中红色标注的几个类:

(1)Collection接口:

* 是List、Set和Queue的父接口,改接口中定义的方法可以操作以上三种集合;
* 常用方法:`add()`添加对象、`remove()`删除对象、`clear()`清空容器、`isEmpty()`判断容器是否为空等。

(2) List系列:有序重复

ArrayList特点:

	* 底层结构是**数组**,可以使用索引实现快速查找;
	* **非线程安全**,建议在单线程中使用ArrayList,而多线程中可以选择Vector或者CopyOnWriteArrayList
	* 是动态数组,相比数组容量可以实现动态增长,默认出事容量为10,每次扩容为原来容量的1.5倍

LinkedList特点

	* 底层是**链表**,增删速度快
	* **非线程安全**
	* 是一个**双向循环**链表,也可以被当作堆栈,队列或双端队列
	* 包含一个非常重要的额内部类**Entry**,是双向链表节点对应的数据结构,其包括的属性有【当前节点做包含的值】、【上一个节点 所包含的值】,【下一个节点所包含的值】

Vector特点:

	*底层结构是**数组**,可用索引实现快速查找
	*使用了synchronized关键字,是**线程安全**的,比ArrayList开销更大,访问更慢
	*默认初始容量为10,默认每次扩容为原来的2倍,可通过**capacityIncrement**属性设置

(3) Set系列:无序,不可重复

HashSet特点

	* **不能**保证元素的排列顺序
	* 使用**Hash算法**来存储集合中的元素。有良好的存取和查找性能
	* **非同步**,多线程并发要注意线程同步问题
	* 集合元素值可为**null**
	* 通过`equal()`判断两个元素是否相等,并且两个元素的`hashCode()`返回值也相等

TreeSet特点

	* 是SortedSet接口的实现类。根据元素**实际值的大小**进行排序
	* 采用**红黑树**的数据结构来存储集合元素
	* 非同步
	* 支持两种排序方法:**自然排序**(默认情况)和**定制排序**。前者通过实现**Comparable接口**中的`compareTo()`比较两个元素之间的大小关系,然后按升序排序;后者通过实现**Comparator()接口**中的`compare()`比较两个元素的大小关系,实现定制排列。

(4)iterator接口:

* 用于遍历Collection中集合的元素,又称**迭代器**。本身不提供盛装对象的能力。
* 必须依赖Collection对象,独立存在无意义
* 常用方法:判断集合是否由下一个元素`hasNext()`,可以通过`remove()`删除集合中上一次`next()`返回的集合元素。

(5)Map接口:

	* 保存具有映射关系的数据
	* Map集合中保存着两组值,一组用于保存Map中的key,一组用于保存Map中的value。
	* key和value可以使仍和引用的类型数据
	* key不允许重复,key也没有顺序。可以把key集合看成一个**Set**集合,他们的存储形式、子类命名也非常相似
	* value允许重复,value通过索引查找,可以把value集合看成一个**List**集合
	* 常用办法:成对添加`put()`和删除`remove()`key-value对,获取指定key的value `get()` 判断是否包含指定key `containsKey()`和指定value `containsValue()`等。

(6)Map系列

HashMap特点

	* 基于AbstractMap类,实现了Map、**cloneable**(可被克隆)、*serializable*(序列化)接口
	* **无序**
	* **非线程安全**
	* 允许在存在一个null的key和任意个为null的value
	* 采用**链表散列**的数据结构,即数组和链表的结合
	* 出事容量为16,填充因子默认为0,75,扩容是是当前容量翻倍,即2capacity

Java基础之--集合

LinkedHashMap特点

	* 继承自HashMap类
	* **有序**,默认为插入顺序,还可以是访问循序
	* **非线程安全**
	* 允许存在一个为null的key和任意个位null的value
	* 内部通过Entry维护了一个双向链表,负责维护Map的迭代顺序

HashTable特点

	* 基于Map接口和Dictionary类
	* **无序**
	* **线程安全**,开销比HashMap大,如果多线程访问一个Map对象,使用HashTable更好
	* 不允许使用null作为key值和value值
	* 底层基于哈希表结构
	* 出事容量为11,填充因子默认为0,75,扩容时时容量翻倍+1,即2capacity+1

TreeMap特点

	* 是SortMap接口的实现类
	* **有序**,根据key对节点进行排序
	* 支持两种排序方法:**自然排序**和**定制排序**。前者所有key必须实现Comparable接口且所有key应该是一个类对象;后者用过传入一个**Comparator接口**对对象负责对多有key进行排序
	* **非线程安全**
	* 采用**红黑树**的数据结构

推荐阅读:Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析