Java基础之--集合
Java基础之集合类:
a.作用:负责保存和盛装其他数据,又称容器类;
* 用于存储数量不等的对象,并可实现常用的数据结构,如栈,队列等;
* 用于保存具有映射关系的关联数组;
和数组的区别
1).数组元素可以是基本类型,也可以是对象;
2).集合只能是对象;
b.体系结构:大致可分为Set,List,Queue和Map四种体系。
* Set:代表**无序,不可重复**的集合;
* List:代表**有序,可重复**的集合
* Map:代表具有**映射关系**的集合;
* Queue:代表一种**队列**集合;
JAVA集合类之间的关系图
主要介绍图中红色标注的几个类:
(1)Collection接口:
* 是List、Set和Queue的父接口,改接口中定义的方法可以操作以上三种集合;
* 常用方法:`add()`添加对象、`remove()`删除对象、`clear()`清空容器、`isEmpty()`判断容器是否为空等。
(2) List系列:有序、重复
* 底层结构是**数组**,可以使用索引实现快速查找;
* **非线程安全**,建议在单线程中使用ArrayList,而多线程中可以选择Vector或者CopyOnWriteArrayList
* 是动态数组,相比数组容量可以实现动态增长,默认出事容量为10,每次扩容为原来容量的1.5倍
* 底层是**链表**,增删速度快
* **非线程安全**
* 是一个**双向循环**链表,也可以被当作堆栈,队列或双端队列
* 包含一个非常重要的额内部类**Entry**,是双向链表节点对应的数据结构,其包括的属性有【当前节点做包含的值】、【上一个节点 所包含的值】,【下一个节点所包含的值】
*底层结构是**数组**,可用索引实现快速查找
*使用了synchronized关键字,是**线程安全**的,比ArrayList开销更大,访问更慢
*默认初始容量为10,默认每次扩容为原来的2倍,可通过**capacityIncrement**属性设置
(3) Set系列:无序,不可重复
* **不能**保证元素的排列顺序
* 使用**Hash算法**来存储集合中的元素。有良好的存取和查找性能
* **非同步**,多线程并发要注意线程同步问题
* 集合元素值可为**null**
* 通过`equal()`判断两个元素是否相等,并且两个元素的`hashCode()`返回值也相等
* 是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系列
* 基于AbstractMap类,实现了Map、**cloneable**(可被克隆)、*serializable*(序列化)接口
* **无序**
* **非线程安全**
* 允许在存在一个null的key和任意个为null的value
* 采用**链表散列**的数据结构,即数组和链表的结合
* 出事容量为16,填充因子默认为0,75,扩容是是当前容量翻倍,即2capacity
* 继承自HashMap类
* **有序**,默认为插入顺序,还可以是访问循序
* **非线程安全**
* 允许存在一个为null的key和任意个位null的value
* 内部通过Entry维护了一个双向链表,负责维护Map的迭代顺序
* 基于Map接口和Dictionary类
* **无序**
* **线程安全**,开销比HashMap大,如果多线程访问一个Map对象,使用HashTable更好
* 不允许使用null作为key值和value值
* 底层基于哈希表结构
* 出事容量为11,填充因子默认为0,75,扩容时时容量翻倍+1,即2capacity+1
* 是SortMap接口的实现类
* **有序**,根据key对节点进行排序
* 支持两种排序方法:**自然排序**和**定制排序**。前者所有key必须实现Comparable接口且所有key应该是一个类对象;后者用过传入一个**Comparator接口**对对象负责对多有key进行排序
* **非线程安全**
* 采用**红黑树**的数据结构