Java 基本集合类学习

本文都是自己对集合的大致理解,有不够严谨的地方请忽略,有错误描述的地方,欢迎指正。

集合主要用到的就是两个接口:Collection 和 Map 

一张简化版的图理清思路


Map存键值对的数据,Collection存单纯的对象。 注意:HashTable属于Dictionary,不在讨论范围(提一嘴,它是线程安全的,key与value均不能有null值)。

Collection

List:可以有序排列,随机访问用ArrayList,删除插入用LinkedList,做遍历删除List中元素强烈建议不在for中操作,会报异常ConcurrentModificationException

Set: 无序,唯一的存储对象。 TreeSet 字典序存对象,字典序输出。 LinkedHashSet 根据插入顺序,排列对象(与Map中TreeMap,LinkedHashMap原理相似)。亲测代码如下:

简单LinkedHashSet  与 TreeSet 测试对比代码


结果截图

可以看出TreeSet遵守的是String字面量的值对比,用的是内置的Comparator。 LinkedHashSet遵守插入顺序。

Map

HashMap:无序,key可以有一个为null,value可以多个为null。LinkedHashMap 类似LinkedHashSet原理

TreeMap:核心是有序!改变comparator就可以改排序方式。原理实现运用到了红黑树保持平衡与效率——拓展知识点“红黑树”介绍(2018/07/26)

红黑树:原理就是BST,二叉平衡查找树。规则限制较多,难点在于何时变色(黑红变化),何时旋转。

    重点原则:1、根一定为黑色

                      2、从根到每个叶子的路径节点上黑色节点个数总量一致

                      3、左右子树高度平衡,不超过对方的一倍

                      4、红色的父子节点都不能为红色

笔者认为变色比旋转更难判断。参考讲解链接:https://www.sohu.com/a/201923614_466939。该链接其实也没讲清楚什么情况下变色。待深入研究,此处仅说明TreeSet,TreeMap的内部实现用到的核心技术,同时Java8的HashMap的Entry表中单个Entry长度超过8个,就重构成红黑树存储hash碰撞的数据。

你可能感兴趣的:(Java 基本集合类学习)