***Collection是最基本的接口 下面有继承的接口list map set ***
List 接口有实现类 arraylist 基于数组的有序可重复实现类 因为是数组 出了名的增删慢,(最早之前是10,后来变成了0,当我们在首次添加元素,需要分配数组空间时,jdk自动帮我们进行了扩容操作,将初始数组长度扩容成了10。这样做有效地降低了无用内存的占用!)但是随机访问元素是很快的,同时因为没有做多线程处理他也是线程不安全,如果对线程安全有要求可以用vetor 当数组大小不满足时需要增加存储能力,就要将已经有数
组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进
行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除
vetor为什么是线程安全的呢 原因是加了synchronized,其他和arraylist一样但是效率低 它支持线程的同步,即某一时刻只有一
个线程能够写 Vector
基于双向链表的list 双向链表的特性就是有地址节点 可以指向上一跳下一跳 所以增删比较快 但是查找速度慢,也是线程不安全 ,业务场景偏向于增删可以考虑使用
Map hashmap key不能重复 可以是null 值可以重复可以是null, 底层是哈希表,说到hash表就要说到hash码 线程不安全 数据结构是数组+链表+红黑树 可以扩容,扩容后数组大小为当前的 2 倍
ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一
些。
*** hashtable key不能重复 值可以重复, 底层是哈希表,说到hash表就要说到hash码 线程安全 并发性不如 ConcurrentHashMap***
***Set hashSet 底层是hashmap 无序不可重复 存取速度快 哈希表边存放的是哈希值。HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不
同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的
hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较
equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是
同一个元素。 ***
***Set linkedhashset 底层是linkedhashmap 无序不可重复 存取速度快 它继承与 HashSet、又基于 linkedHashMap 来实现的 ***



