1、Collection 和 Collections 有什么区别?
java 容器分为两大类,集合序列 和 键值对。其中 Collection 是所有集合继承的最顶层接口,其中声明的方法有对集合的操作的 增删改查等,所有具体的集合类都继承这个接口。例如 ArrayList, HashSet 等。
Collections 是包装类,,其中包含很多静态方法,理解为操作集合的工具类。例如:add() sort() 等。
2、List、Set、Map 之间的区别是什么?
java 容器分为两大类,集合序列 和 键值对,其中 List 、Set 属于集合序列.
List 存储有序的、可重复的数据
Set 存储无序的(TreeSet 除外),不可重复的数据
Map 存储无序的(TreeMap除外),key 必须唯一不可重复,value 可以重复。
3、ArrayList 和 LinkedList 的区别是什么?
ArrayList 和 LinkedList 是 List 类的子类,因此 List 接口 和 Collection 接口共同支持的是 2者的
相同点:
- 元素有序,可重复
- 可以存储元素 null
- 都是线程不安全的
不同点:
LinkedList 除了实现 List 接口还实现了 Queue 接口,可以用来当做队列使用。
内部实现的不同点:
ArrayList
LinkedList
底层数据结构
动态数组
双向链表
按照下标随机访问
支持
不支持
末尾处插入数据时间复杂度
O(1)
O(1)
指定index处插入数据时间复杂度
O(n)
O(n)
是否需要扩容
需要动态扩容
不需要,每次只是新建 Node 节点
插入和删除LinkedList 会比 ArrayList 快一些,即使都是 O(n),但是ArrayList 还涉及到扩容:
- ArrayList O(n) = 查找O(1) + 移动O(n)
- LinkedList O(n) = 查找O(n/2) +移动O(1),因为是双端队列查找时直接确定是前一半还是后一半,插入也只是新建 node 节点修改指向。
4、HasMap 的了解 学习总结
- 数组+链表(红黑树)的结构,具有数据和链表的优点,查找和插入都相对比较快,但是涉及到扩容
- 如何插入元素:
1、是否需要初始化数组大小,默认16。
2、构建(k,v) node,根据 k 计算出 哈希值 hash。% 上数组长度,得到数组下标。
3、下标处没有元素则直接放置
4、下标处有元素,则按照链表继续找,有相同key 则替换,无则添加在链表末尾。
5、下标处 node 节点数量 > 8 ,会将链表转为红黑树结构
6、下标处 node 节点数量/数组长度 >= 加载因子(默认为0.75),数组扩容至2倍,重新分配 node. - 如何查找元素:
1、根据 k 计算出 哈希值 hash。% 上数组长度,得到数组下标
2、下标处没有元素,返回 null
3、下标处有元素,顺着链表或者红黑树去查找,找的则返回value,否则返回 null - 可以存储 (null, null) ,线程不安全的(hashTable 是线程安全的)
- 为什么扩容至 2 倍,其实在判断下标时时采用 (n-1)& hash,其中 n 是数组长度。当数组长度为 2的x次幂时,刚好 n - 1 的二进制表示每一位都是1, 执行 & 运算时能更好的均匀分布。
5、TreeMap 的了解 学习总结
- 底层结构为红黑二叉树,增删改查的效率都比较高
- 存放的元素是无序的(指的是元素顺序与插入顺序不一致,LinkedHashMap 有序)
- 默认会对键进行排序
所以键必须实现自然排序和定制排序中的一种
key 不可以为null(需要排序)
key 重复进行覆盖指,比较器按照键中具体的排序规则返回 0,与key.equals() 无关 - 有两种排序方法
自然排序算法,需要类实现 Comparable 接口,重写 compareTo()方法。
定制排序 Comparator,一般采用匿名内部类的方式
6、LinkedHashMap 的了解 学习总结
- 底层是 HashMap + 双向列表
- 实现了元素有序
- 可以存储 null
7、HashMap 和 TreeMap 和 LinkedHashMap 的使用场景
强调:使用map接口的实现类时,切记不要修改key的属性值,否则就会找不到key 所对应的 value值
HashMap 效率最高
需要针对 key 进行排序时使用 TreeMap
需要保证插入的元素有序时使用 LinkedHashMap
8、HashSet 和 TreeSet 和 LinkedHashSet 的使用场景 学习总结
因为 Set 的底层结构是 Map ,所以三者的特点和使用场景可以参考HashMap 和 TreeMap 和 LinkedHashMap ,需要注意的是,Set 中元素是不允许重复的(Set 的值是底层时存储在 Map 的 Key 中的,key 是不能重复的)。
9、HashMap 和 HashSet 的区别是什么?
HashSet 底层也是实现了一个 HashMap
HashMap 存储了 key, value,HashSet 只存储了 key , value 是一个空对象,
HashMap 和 HashSet 都是可以存储 null 的。
HashMap 的 value 是可以重复的,但是 HashSet 因为只存储 key 是不可以重复的。
10、那些容器是线程安全的
我们常用的容器都是线程不安全的,线程安全的容器按照分类如下
List :Vector、Stack
Map: Hashtable
Set:
JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就是 ConcurrentHashMap。