线性集合
List 为何有序 Set为何无序(如何做到有序)
List为何可以重复 而Set却不重复?
List可以理解成线性数据结构,它的扩容机制是什么样的?
重点:HashMap原理 理解红黑树的概念
这里我们先讲下set实现。
Set<Integer> set = new HashSet<>();

是不是觉得很奇妙,对,你没看错,set内部实现就是通过hashmap来实现的。
我们再来,set的add方法

你们想想 map的key可以重复吗?所以,了解set,还是要先了解Map集合!
HashMap是采用数组+链表的形式。
TODO 今天就到这了,后续继续。
-------------------
Map我最后来讲,再讲一个示例
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
//list有序
System.out.println(JSONObject.toJSONString(list));
Set<Integer> set = new HashSet<>();
set.add(19);
set.add(21);
set.add(30);
set.add(4);
set.add(58);
set.add(6);
//set无序
System.out.println(JSONObject.toJSONString(set));
Set<Integer> linkedHashSet = new LinkedHashSet();
linkedHashSet.add(10);
linkedHashSet.add(12);
linkedHashSet.add(3);
linkedHashSet.add(6);
linkedHashSet.add(7);
linkedHashSet.add(8);
//linkedHashSet 按照添加顺序
System.out.println(JSONObject.toJSONString(linkedHashSet));
TreeSet<Integer> tree = new TreeSet<>();
tree.add(1);
tree.add(3);
tree.add(2);
tree.add(10);
tree.add(9);
//TreeSet 自动排序
System.out.println(JSONObject.toJSONString(tree));
输出结果:

大家平时编码时候多注意一点,需要什么数据结构的数据,这里需要重点提出的是效率问题!
2020/08/08
对于集合类,如果可以提前设定集合大小,就提前设定好,因为集合的扩容是一件很费事的事情。扩容后包括要copy原集合数据到新的集合中去!
对于List扩容代码

你知道每次扩容多少吗?
ArrayList是数组连续的存储(查询比较快的原因是有索引,并且部分或者全部都会存到cpu缓存当中)那LinkedList是双向列表(包含一个前驱和一个后驱)。它又是怎么实现add甚至是扩容的呢!
浙公网安备 33010602011771号