java集合概述
为了保证数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。Java集合大致可分为Set、List、Map和Queue四种体系,其中本文章主要详解前三种体系,Set代表无序、不可重复的集合;List代表有序、重复的集合;Map代表具有映射关系的集合。
集合继承结构图
Collection接口
Collection接口LIst、Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合。
下面介绍Collection的常用方法
boolean add(Object o): 该方法用于向集合里添加一个元素。如果集合对象被添加操作改变了,则返回true。
void clean(): 清除集合里的所有元素,将集合长度变为0。
boolean contains(Object o): 返回集合里是否包换指定元素。
Iterator iterator (): 返回一个Iterator对象,用于遍历集合里的元素
int size (): 该方法返回集合里元素的个数。
Object [ ] toArray(): 该方法把集合转换成一个数组,所有的集合元素编程对应的数组元素。
Iterator接口
Iterator对象被称为迭代器
下面介绍Iterator的常用方法
boolean hasNext(): 如果被迭代的集合元素还没有被遍历完,则返回true。
Object next ():返回集合里的下一个元素
void remove(): 删除集合里上次next方法返回的元素
Set集合
Set集合不允许包含相同的元素,如果师徒把俩个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被添加。主要介绍HashSet和TreeSet实现类。
HashSet类
HashSet具有以下特点:
1.不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化。
2.HashSet不是同步的,如果多个线程同时访问一个HashSet,假设有俩个或俩个以上线程同时修改啊了HashSet集合时, 则必须通过代码来保证其同步。
3.集合元素值可以是null。
4. HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构
5. 哈希表又叫做散列表,哈希表底层是一个数组,这个数字中每一个元素是一个单向链表。
每个单向链表都有一个独一无二的hash值,代表数字的下标。
在某个单向链表中的每一个节点上的hash值相等的。hash值实际上是key调用hashCode方法, 在通过哈希算法转换成 的值。
6. 如何向哈希表中添加元素:
* 先调用被存在存储的key的hashCode方法,经过某个算法得出hash值,如果在这个哈希表中不存在这hash值,则直接加入元素。
* 如果该hash值已经存在,继续调用key之间的equals方法,如果equals方法返回false,则将该元素添加。如果equals方法返回true,
* 则放弃添加该元素。
*
7.HashSet其实是HasjMap中的key部分。HashSet有什么特点,HashMap中的key应该具有相同的特点
TreeSet类
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。TreeSet并不是根据元素的插入顺序进行排序的,而是根据实际值的大小来进行排序的。
List集合
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
List增加的常用方法
Object get(int index ): 返回集合index索引处的元素
int indexOf(Object o): 返回对象o在List集合中第一次出现的位置索引
ArrayList类和Vector类
1.ArrayList集合底层是数组,数组是有下标的, 所以ArrayList集合有很多自己的特性
2.ArrayList集合底层默认初始化容量是10, 扩大之后的容量是原容量的1.5倍
3.Vector集合底层默认初始化容量也是10.扩大之后的容量是原容量的2倍
4.如何优化ArrayList和Vector ?
* 尽量减少扩容操作,因为扩容需要数组拷贝,数组拷贝很耗内存
* 一般推荐在创建集合的时候指定初始化容量。
Map集合
Map用于保存具有映射关系的数据,因此Map集合里保存着俩组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以使任何引用类型的数据。Map的key不允许重复。key和value之间存在单向一对一关系,既通过指定的key,总能找到唯一的、确定的value。
如果把Map里所有的key放在一起看,它们就组成了一个Set集合(所有的key没有顺序,key与key之间不能重复);如果把Map里所有value放在一起来看,它们又非常类似于一个List:元素与元素之间可以重复,每个元素可以根据索引来查找,只是Map中的索引不再使用整数值,而是以另一个对象作为索引。
Map集合的常用方法
void clean ():删除该Map对象中的所有key-value对
Boolean containsKey(Object key):查询Map中是否包含指定的Key,如果包含返回true
Boolean containsValue(Object value):查询Map中是否包含指定的value,如果包含返回true
Object get (Object key ):返回指定key所对应的value;如果此Map不包含该key,则返回null
Object put(Object key,Object value): 添加一个key-value对,如果当前Map中已经有一个与该key相等的key-value 对,则新的key-value对会覆盖原来的key-value对。