关于Collection和Map的笔记
此二者在日常编程中,用得太频繁,所以多少有必要记录下,便于需要的时候翻翻。
但鉴于它们的后代太多,逐一牢记有有点难度,所以学习上应该把握以下几点即可:
- 含义
- 重要区别
- 常用的实现类和工具
- 关注要点:有序性,唯一性,更新速度,查找速度,线程安全,更新方式
在日常工作中,应当在思考设计目的的基础上选择需要的实现类,例如是考虑效率还是线程安全,是要求FIFO还是FILO。
如果以下就知道要用哪一种,那么就使用,否则找找参考资料。参考资料可以是专业书籍,也可以是权威的网站或者是博客。
一、基本概念以及集合和映射的区别
1.1 Collection-集合
用于保存若干对象的对象。本质上使用数组存储每个元素,每个元素的类型不必都一样,也不要求都是有序存放。
数组通常只存放原本身,不存储对于的内容,这是和映射最主要的区别。
1.2 Map-映射
顾名思义,需要一个对象元素必须有两个对象对应:键和值,或者是key和value。
把key翻译为“键”可能不是那么贴切,也许可以意译为“指引”,而"value"可以意译为“涵义”或者“内容”。
1.3集合和映射的区别和相同点
要逐一细细列出所有,没有必要。 这里只列出一条根本性的区别:集合通过索引或者内容查找,隐射通过“指引”查找。
相同点:最重要一条:它们都实现了迭代接口,可以通过这个接口来遍历元素。
1.4其它一些概念
- fail-fast
可以参见这个 java中的fail-fast(快速失败)机制_Howard_14的博客-CSDN博客_fail-fast机制
简单翻译为“快速失败”,作用在于并发的场景中,提醒用户这个操作是不安全的,让用户用个安全的操作。
- Serial和Serializable
系列化。java类型中集合和map的代码写得比较特别,其中一部分就是序列化。好多类型都个性化了writeObject方法。
二、常见后代/实现类介绍
2.1、Collection接口下几个常见后代
- ArrayList(阵列列表)--
- LinkedList(链接列表),
- vector(矢量列表),为什么叫“矢量”有点让人迷惑,是否因为词穷了?除了有大小还有什么了?
- SortedSet /TreeSet(有序套)
- Queue(队列)
arrayList,LinkedList,vector的区别
Vector、ArrayList和LinkedList有什么区别_shumeigang的博客-CSDN博客_arraylist vector和linkedlist的区别
1.基本区别:三个类都实现了List接口,都是有序集合,数据是允许重复的;ArrayList 和Vector都是基于数组实现存储的,集合中的元素的位置都是有顺序即连续的;LinkedList是基于双向链表实现存储的,集合中的元素的位置是不连续的
2.性能区别:Vector和ArrayList底层实现原理一致,但是Vector是线程安全的,因此性能比ArrayList差很多;LinkedList相比于集合Vector和ArrayList在插入,修改,删除等操作上速度较快,但是随机访问的性能较差
3.安全区别:Vector是使用了synchronized同步锁是线程安全的,ArrayList和LinkedList都是线程不安全的
4.原理区别:ArrayList与Vector都有初始的容量大小,当存储的元素的个数超过了容量时,就需要增加存储空间,Vector默认增长为原来两倍,而ArrayList的增长为原来的1.5倍;
ArrayList与Vector都可以设置初始空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法
ArrayList和LinkedList区别
1.ArrayList和LinkedList区别 - 努力的达子 - 博客园 (cnblogs.com)
1.1. ⾸先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的
1.2. 由于底层数据结构不同,他们所适⽤的场景也不同,ArrayList更适合随机查找,
LinkedList更适合删除和添加,查询、添加、删除的时间复杂度不同
1.3. 另外ArrayList和LinkedList都实现了List接⼝,但是LinkedList还额外实现了Deque接⼝,所以
LinkedList还可以当做队列来使⽤
treeSet的说明
TreeSet详解和使用示例_动力节点Java学院整理_java_脚本之家 (jb51.net)
(01) TreeSet实际上是TreeMap实现的。当我们构造TreeSet时;若使用不带参数的构造函数,则TreeSet的使用自然比较器;若用户需要使用自定义的比较器,则需要使用带比较器的参数。
(02) TreeSet是非线程安全的。
(03) TreeSet实现java.io.Serializable的方式。当写入到输出流时,依次写入“比较器、容量、全部元素”;当读出输入流时,再依次读取。
treeSet的主要作用是排序。
queue(队列)
队列还是很常用的数据类型,可以参阅:
JAVA队列( Queue ) 详解_java叶新东老师的博客-CSDN博客_java queue -- 简单的定义和关系
Java Queue队列的用法(非常全面)_微学苑 (weixueyuan.net)
2.2、map接口的几个常见后代
- TreeMap -- 主要用于排序
- HashMap --优点:随机获取效率较高
没有太多需要介绍的。
2.3、糅合Collection和Map的类型
TreeSet
代码很有意思,看看它的构造和add方法:
public TreeSet() { this(new TreeMap<>()); } TreeSet(NavigableMap<E,Object> m) { this.m = m; } public boolean add(E e) { return m.put(e, PRESENT)==null; }
2.4并发
有人写了比较全的资料
java集合大全(二)并发_yunyun1886358的博客-CSDN博客_java并发集合类
Java软件开发|高并发编程篇之——安全访问的集合(1) (baidu.com)
这两个资料的价值分别是名词解析和Collections工具类。
有必要把一些名词重复下:
- ArrayBlockingQueue
- DelayBlockingQueue
- TransferQueue
- LinkedTransferQueue
- PriorityBlockingQueue
- SynchronousQueue
- ConcurrentHashMap
- ConcurrentSkipListMap
- ConcurrentSkipListSet
- CopyOnWriteArrayList
- CopyOnWriteArraySet
三、常见工具
3.1 Collection常见工具类
- Collections-范围大一些,此外提供了一些并发的东西
- Arrays,范围小一些,主要针数组的,也可以和List挂钩上
3.2 Map常见工具类
自带的好像没有发现,以后如有发现再补充。