Java容器类
在Java中有着一种专门存放对象或对象引用的类,叫做容器类,或者叫集合类
容器类并不是特指某个类。按照一定的存储方式对对象进行存储的类都叫容器类。
而按照存储方式的不同可将容器类分为两种
1:实现collection接口的类:定义独立元素的序列
2:实现Map接口的类:定义成对的键值(key-value),并且map不能有重复的key
collection容器
collection可以继续细分为三种子接口
1:list:该集合内元素为有序可重复//如数组链表
2:set:该集合内元素为无序不可重复//注意!set在存储元素时并非顺序存储,而且重复元素不会进行添加
3:queue:该集合内元素为先进先出//队列
list容器
list容器的三个重要容器类
ArrayList
动态数组类,内部数据结构由数组实现,该类实现了元素的快速随机访问,但是在删除或添加元素时需要移动大量的元素,因此不适合频繁的删除和增加
Vector
向量类,跟ArrayList基本一致,但有一点不同,Vector类的每一个方法都加了同步锁,好处是线程安全,坏处是访问速度要比ArrayList慢
LinkedList
链表类,内部数据结构是链表,该类实现了元素方便快速修改,但降低了访问速度,适合修改元素频繁的场景
set容器
set容器有两个重要的实现类
HashSet
该类封装了HashMap,在向HashSet中添加元素时,先判断容器内是否已经有该元素,没有该元素才添加,这个过程是线程不安全的,并且不保证顺序不变
TreeSet
该类封装了TreeMap,在添加元素时会考虑顺序(这点与HashSet不同),并且同样不保证线程安全,不允许存在null
queue容器
queue容器实现了队列的存储结构,遵循先进先出的原则
Map容器
Map容器有两个重要的实现类
HashMap
该类是由数组链表和红黑树实现的,数组中存放的是单链表的引用,也就是说数组的大小就是单链表的多少,当链表的长度大于8时,链表存储会改为红黑树存储。
为什么要引入红黑树:在链表中查找元素时间复杂度为O(n)。而红黑树在查找时时间复杂度为O(logn),在链表长度较少时没有影响,当链表长度过多时,引入红黑树存储能提高读取速度
当元素想要添加进HashMap时,先调用hashCode()计算key值,根据key找到对应的链表,若链表中存在该值,则丢弃,若不存在,则添加进去
HashTable
与HashMap基本类似,不同点在于HashTable是线程安全的,但会造成性能损失
Iterator
Iterator是迭代器,它能在不知道容器内元素类型的情况下遍历所有元素,不属于Colletion和Map接口体系