集合容器类的理解

469 阅读5分钟
在日常开发中会经常使用到集合,知其然却不知其所以然,为此在这里记录下自己对集合的理解;
在每天的CRUD工作中如何成长,在于不断的总结与思考,没有人可以随便的成功,也没有人可以随便失败;
千里之行,始于足下;
跬步千里,冰冻三尺非一日之寒;
 1、从集合的类图入手,单列集合、双列集合的顶层接口与具体实现类有哪些?
 2、它们分别有哪些特征?
 3、底层的由什么数据结构实现?
 4、实现类常用的Api源码解读?

单列集合顶级接口 Collection

官网对 Collection 的定义解释为
The root interface in the collection hierarchy. A collection represents a group of objects, known as its elements. 
Some collections allow duplicate elements and others do not. Some are ordered and others unordered. 
The JDK does not provide any direct implementations of this interface: 
it provides implementations of more specific subinterfaces like Set and List. 
This interface is typically used to pass collections around and manipulate them where maximum generality is desired.
集合层次结构中的根接口。集合表示一组对象,称为其元素。有些集合允许复制元素,有些则不允许。
有些是有序的,有些是无序的。JDK没有提供该接口的任何直接实现:它提供了更具体的子接口(如Set和List)的实现。
此接口通常用于在需要最大通用性的地方传递和操作集合。

List类型特征总结

List类型 线程是否安全 底层数据结构 CRUD的效率
ArrayList Object数组 因为实现了RandomAccess接口,拥有随机快速访问的能力,基于底层数据结构由数组实现,可以通过下标访问,所以修改与查询的效率高;但是如果删除某个元素比如第 i 个元素,则要将 i 之后的元素都向前移一位以保证顺序表的正确,增加也是一样,要移动多个元素,所以多次删除增加的话是很低效的;
LinkedList 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环) LinkedList底层数据结构由双向链表实现,注意是链表。要查询只能头结点开始逐步查询,不像数组可以通过下标快递定位到元素,在查询的时候需要遍历。但是,如果要增加后删除一个元素的话,只需要改变其前后元素的指向即可,不需要像Arraylist(数组)那样整体移动,所以才说多用于增删多的场合;
Vector 是(方法用synchronized修饰) Object数组 都慢,被ArrayList替代,长度任意延长;

Set类型特征总结

Set类型 底层数据结构 是否有序
HashSet HashSet 底层就是基于 HashMap 实现
TreeSet 红-黑树结构 自然排序(默认)和定制排序
LinkedHashSet 链表 是(根据元素的hashCode值决定存储位置)

双列集合顶级接口 Map

官网对 Map 的定义解释为:
An object that maps keys to values. A map cannot contain duplicate keys; each key can map to at most one value.
This interface takes the place of the Dictionary class, which was a totally abstract class rather than an interface.
The Map interface provides three collection views, which allow a maps contents to be viewed as a set of keys, 
collection of values, or set of key-value mappings. The order of a map is defined as the order in which the iterators 
on the maps collection views return their elements. Some map implementations, like the TreeMap class, make specific 
guarantees as to their order; others, like the HashMap class, do not.
将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值。
这个接口代替了Dictionary类,Dictionary类是一个完全抽象的类,而不是接口。
Map接口提供了三个集合视图,它们允许将映射的内容视为一组键、值的集合或一组键-值映射。
映射的顺序定义为映射集合视图上的迭代器返回其元素的顺序。
一些映射实现,比如TreeMap类,对它们的顺序做了特定的保证;而其他类,如HashMap类,则没有。

Map类型特征总结

Map类型 底层数据结构 使用场景
HashMap (允许存在一个null键 ) 哈希散列表 快速查询
LinkedHashMap 链表 迭代遍历具有顺序(顺序插入)
TreeMap 红-黑树结构 具有排序,唯一可以返回子树的Map(subMap())
ConcurrentHashMap 链表 线程安全的Map
WeakHashMap 哈希散列表 key 是弱引用类型,可以被垃圾回收
HashTable(几乎被淘汰,不允许存在null键) 哈希散列表 需要保证线程安全推荐使用ConcurrentHashMap

本篇文章仅仅简单介绍集合容器类,在后文中将针对每种类型集合常用的Api进行源码解读等等,主要分为:单列集合(ArrayList、LinKedList) / 双列集合(HashMap、LinkedHashMap),为什么不讲Set集合?我相信你看过源码之后就会知道原因了;

鄙人不才,在您面前献丑只愿与您结伴而行,文章若有不当之处,望大佬指点一二;如果我对您有帮助的话,还希望您能点赞分享,成长是一场苦涩的独自修行,我很需要您的陪伴与支持,这也是鄙人不断前行的根本动力,让我们在互相陪伴见证彼此生长的同时能够感染身边最亲近的人一同成长,鄙人在此叩谢!