一、java
(1)集合
1.list:LinkedList、ArrayList和Vector
- LinkedList 接口实现类, 链表, 插入删除, 没有同步, 线程不安全
- ArrayList 接口实现类, 数组, 随机访问, 没有同步, 线程不安全
- Vector 接口实现类 数组, 同步, 线程安全
2.set:HashSet和TreeSet
- HashSet 使用哈希表存储元素,元素可以是null
- LinkedHashSet 链表维护元素的插入次序
- TreeSet 底层实现为红黑树,元素排好序,元素不可以是null
篇幅限制下面就只能给大家展示小册部分内容了。包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套资料及答案的在【翻到文章底部,点击名片】即可免费获取 备注:“CSDN”
3.map:HashMap、TreeMap和HashTable
- 线程安全
- HshaMap线程不安全
- TreeMap线程不安全
- HashTable线程安全
- 空值
- HashMap一个null key,多个null value
- TreeMap不能null key,多个null value
- HashTable都不能有null
- 继承和接口
- HashMap继承AbstractMap,实现接口Map
- TreeMap继承AbstractMap,实现接口NavigableMap(SortMap的一种)
- HashTable继承Dictionary,实现接口Map
- 顺序
- HashMap中key是无序的
- TreeMap是有序的
- HashTable是无序的
- 构造函数
- HashMap有调优初始容量和负载因子
- TreeMap没有
- HashTable有
- 数据结构
- HashMap是链表+数组+红黑树
- TreeMap是红黑树
- HashTable是链表+数组
4.list、set和map的区别
- list:元素按进入先后有序保存,可重复
- set:不可重复,并做内部排序
- map:代表具有映射关系的集合,其所有的key是一个Set集合,即key无序且不能重复。
5.HashMap扩容机制
- 数组的初始容量为16,而容量是以2的次方扩充的,一是为了提高性能使用足够大的数组,二是为了能使用位运算代替取模预算(据说提升了5~8倍)。
- 数组是否需要扩充是通过负载因子判断的,如果当前元素个数为数组容量的0.75时,就会扩充数组。这个0.75就是默认的负载因子,可由构造器传入。我们也可以设置大于1的负载因子,这样数组就不会扩充,牺牲性能,节省内存。
- 为了解决碰撞,数组中的元素是单向链表类型。当链表长度到达一个阈值时(7或8),会将链表转换成红黑树提高性能。而当链表长度缩小到另一个阈值时(6),又会将红黑树转换回单向链表提高性能。
- 对于第三点补充说明,检查链表长度转换成红黑树之前,还会先检测当前数组数组是否到达一个阈值(64),如果没有到达这个容量,会放弃转换,先去扩充数组。所以上面也说了链表长度的阈值是7或8,因为会有一次放弃转换的操作。
6.HashMap中的循环链表是如何产生的(jdk1.7)
- 由于jdk1.7中采用头插法,在多线程中,存在两个线程同时对链表进行扩容的情况,执行transfer函数(链表数据转移)会导致链表数据倒置,当两个线程同时此操作,就导致链表死循环
7.B树和B+树的区别
- B树是二叉排序树进化而来;B+树是分块查找进化而来
- B+树叶节点包含所有数据,非叶节点仅起到索引作用;B树终端节点及以上都包含数据且不重复(叶节点只是一个概念,并不存在)
- B+树叶节点包含了全部关键字
- B+树支持顺序查找和多路查找,B树只支持多路查找
8. HashMap为什么用红黑树而不是AVL树或者B+树
- AVL树更加严格平衡,因此可以提供更快的査找效果。因此,对于查找密集型任务使用AVL树没毛病。 但是