本专栏记录Java后端开发相关的面试题,欢迎大家阅读专栏的其他文章。
目录
1.B树和B+树的区别?B树和B+树的优点分别是?
2.排序算法的种类和复杂度
3.HashMap和Hashtable的原理、区别、应用场景
4.ConcurrentHashMap的原理、应用场景
5.ArrayList和LinkedList的区别?原理?应用场景?
6.String、StringBuilder和StringBuffer的区别,应用场景
7.ArrayList和Vector的区别
8.Collection下有哪些子类
9.Comparable和Comparator的区别
B树和B+树详细解析_星空是梦想的博客-CSDN博客
1.1 B树和B+树的区别
B树特征:
B+树特征:
B树和B+树区别:
1.2 B树的优点
相比于普通的二叉树来说,B树是平衡二叉树,它增加和删除节点对树的整体结构来说,改动非常小,适合用来存储大数据
1.3 B+树的优点
2.1 什么是算法的空间复杂度
算法的空间复杂度是指:算法在运行过程中,除了存储算法基本数据的空间外,需要耗费的额外空间。
2.2 排序算法的时间和空间复杂度
算法名称 | 时间复杂度 | 空间复杂度 |
---|---|---|
冒泡排序 | O(n^2) | O(1) |
直接插入排序 | O(n^2) | O(1) |
直接选择排序 | O(n^2) | O(1) |
快速排序 | O(n*logn) | O(n*logn) |
希尔排序 | O(n*logn) | O(1) |
堆排序 | O(n*logn) | O(1) |
计数排序 介绍 |
O(d(n+k)) | O(n+k) |
归并排序 | O(n*logn) | O(n) |
3.1 原理
3.2 区别
HashMap 和 Hashtable 的主要区别是:
3.3 应用场景
HashMap 用于非并发场景,Hashtable 用于并发场景,但是并发场景推荐使用concurrentHashMap。
4.1 原理
4.2 应用场景
多线程情况下对 HashMap 进行添加、删除操作时使用。虽然 Hashtable 和 ConcurrentHashMap 的应用场景差不多,但是还是尽量使用 ConcurrentHashMap。
5.1 ArrayList原理
小学生也能看懂的ArrayList底层原理_怎么看arraylist的底层_星空是梦想的博客-CSDN博客
ArrayList 底层使用 char数组 实现,除了数组,还有一个记录数组大小的 size 变量,添加数组元素时,当数组已满时,会进行扩容,将容量扩大为 1.5 倍。
5.2 LinkedList原理
学透 LinkedList 底层实现原理,狂虐面试官!_星空是梦想的博客-CSDN博客
LinkedList 底层使用 双向链表 实现,LinkedList类中有头节点(first)、尾节点(last)和记录链表长度的 size。
LinkedList 的节点结构为:item(存储节点值)、next(存储下一个节点)和 prev(存储上一个节点)。
5.3 两者区别
5.4 应用场景
如果涉及到“栈”、“队列”、“链表”等操作,应该选择使用 List;
如果需要快速删除、插入元素,应该使用 LinkedList ;
如果需要快速访问元素,应该使用 ArrayList。
6.1 运行速度比较
运行速度测试代码
StringBuilder > StringBuffer > String
解释:
创建 String 对象后,因为 String 对象是不可变的,每次需要改变 String 的值,都要重新建立一个新对象,再将引用指向该对象,浪费内存,而且无用对象多了 jvm 会引发 GC,系统就变慢了。
StringBuilder 和 StringBuffer 是可变的字符串变量,在进行字符串拼接时,不会创建新对象,而是直接对原对象进行操作,速度上比 String 拼接快很多;另外,由于 StringBuffer 底层实现都加了 synchronized 修饰,执行速度上稍微比 StringBuilder 慢一点。
6.2 是否线程安全
解释:
StringBuffer 底层的很多方法(例如append 和 inser)都使用 synchronized 关键字修饰,保证了多线程情境下的线程安全。
6.3 适用场景
6.4 底层实现
StringBuilder和StringBuffer:
7.1 相同点
ArrayList 和 Vector 都实现了List接口,都是有序可重复集合。
7.2 不同点
List
Set