飞利浦·斯塔克|java容器类介绍

飞利浦·斯塔克|java容器类介绍

文章图片

飞利浦·斯塔克|java容器类介绍

1.常用容器分类

接口和抽象类Collection接口:是高度抽象出来的集合 , 它包含了集合的基本操作和属性 。 Collection包含了List和Set两大分支 。
List:是一个有序的队列 , 每一个元素都有它的索引 。 第一个元素的索引值是0 。 实现类有LinkedList ArrayList Vector Stack 。
Set:不允许有重复元素的集合 。Set的实现类有HastSet和TreeSet 。 HashSet依赖于HashMap , 它实际上是通过HashMap实现的;TreeSet依赖于TreeMap , 它实际上是通过TreeMap实现的 。
Map接口:key-value键值对 。 Map中的每一个元素包含“一个key”和“key对应的value” 。 AbstractMap抽象类:它实现了Map接口中的大部分API 。
HashMap , TreeMap , WeakHashMap都是继承于AbstractMap 。
Hashtable:虽然继承于Dictionary , 但它实现了Map接口 。
Iterator:迭代器 。 Collection依赖于Iterator , 是因为Collection的实现类都要实现iterator()函数 , 返回一个Iterator对象 。 ListIterator是专门为遍历List而存在的 。
Enumeration:是JDK 1.0引入的抽象类 。 作用和Iterator一样 , 也是遍历集合;但是Enumeration的功能要比Iterator少 。 Enumeration只能在Hashtable Vector Stack中使用 。

实现类ArrayList:是一个动态数组 , 也是我们最常用的集合 。 它允许任何符合规则的元素插入甚至包括null 。 每一个ArrayList都有一个初始容量:10 。
LinkedList:不能随机访问 , 它所有的操作都是要按照双重链表的需要执行 。
Vector:与ArrayList类似 , 但是是同步的 。
Stack:继承自Vector , 实现一个后进先出的堆栈 。 基本的push和pop方法 , 还有peek方法得到栈顶的元素 , empty方法测试堆栈是否为空 , search方法检测一个元素在堆栈中的位置 。 Stack刚创建后是空栈 。
Queue:队列 , 先入先出 , FIFO由linkedList实现 , LinkedList采用双向链表 , 本身就有addFirst addLast getFirst getLast等功能的需求 , 而队列是只是特定功能的LinkedList , 二者实现的方法都是一样 。
HashSet:堪称查询速度最快的集合 , 因为其内部是以HashCode来实现的 。 集合元素可以是null但只能放入一个null 。 它内部元素的顺序是由哈希码来决定的 , 所以它不保证set的迭代顺序;特别是它不保证该顺序恒久不变 。
TreeSet:是二叉树实现的 , 基于TreeMap , 生成一个总是处于排序状态的set , 内部以TreeMap来实现 , 不允许放入null值 。 它是使用元素的自然顺序对元素进行排序 , 或者根据创建Set时提供的 Comparator 进行排序 , 具体取决于使用的构造方法 。
LinkedHashSet:集合同样是根据元素的hashCode值来决定元素的存储位置 , 但是它同时使用链表维护元素的次序 。 LinkedHashSet将会以元素的添加顺序访问集合的元素 。 LinkedHashSet在迭代访问Set中的全部元素时 , 性能比HashSet好 , 但是插入时性能稍微逊色于HashSet 。
EnumSet:中所有值都必须是指定枚举类型的值 , 它的元素也是有序的 , 以枚举值在枚举类的定义顺序来决定集合元素的顺序 。 EnumSet集合不允许加入null元素 , 否则会抛出NullPointerException异常 。
HashMap:以哈希表数据结构实现 , 查找对象时通过哈希函数计算其位置 , 它是为快速查询而设计的 , 其内部定义了一个hash表数组(Entry[
table) , 元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引 , 如果有冲突 , 则使用散列链表的形式将所有相同哈希地址的元素串起来 , 可能通过查看HashMap.Entry的源码它是一个单链表结构 。 (初始容量值:16 , 加载因子0.75f , 扩容两倍)
HashTable:也是以哈希表数据结构实现的 , 解决冲突时与HashMap也一样也是采用了散列链表的形式 。 HashTable继承Dictionary类 , 实现Map接口 。 其中Dictionary类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类 。 每个键和每个值都是一个对象 。 在任何一个 Dictionary 对象中 , 每个键至多与一个值相关联 。 Map是”key-value键值对”接口 。HashTable采用”拉链法”实现哈希表不过性能比HashMap要低 。 (初始容量16 , 加载因子0.75f , 扩容两倍 。 )
TreeMap:有序散列表 , 实现SortedMap接口 , 底层通过红黑树实现 。
WeakHashMap:以弱键实现的基于哈希表的Map 。 在 WeakHashMap 中 , 当某个键不再正常使用时 , 将自动移除其条目 。 更精确地说 , 对于一个给定的键 , 其映射的存在并不阻止垃圾回收器对该键的丢弃 , 这就使该键成为可终止的 , 被终止 , 然后被回收 。 丢弃某个键时 , 其条目从映射中有效地移除 , 因此 , 该类的行为与其他的 Map 实现有所不同 。 null值和null键都被支持 。 该类具有与HashMap类相似的性能特征并具有相同的效能参数初始容量和加载因子 。

容器类补充
1)需要快速插入 , 删除元素 , 应该使用LinkedList , 如果需要快速随机访问元素 , 应该使用ArrayList 。
2)可以使用Collections 工具类中unmodifiableList/unmodifiableMap/unmodifiableSet/unmodifiableSortedMap/unmodifiableSortedSet等创建不能修改的ListMapList等
【飞利浦·斯塔克|java容器类介绍】3)可以使用Collections工具类中Collections.synchronizedList(new ArrayList())等实现同步


    推荐阅读