面试八股文,
图片很多30多M,慎点
Java
查找算法
实现

公式优化防止溢出

使用移位

排序
冒泡
冒泡实现

优化1,减少内置循环

优化2,减少冒泡次数

最终优化使用变量控制避免无效冒泡
认为最后一次交之后的元素均已达成排序条件

选择
实现

插入
实现

快速排序
单边快排


双边快排

ArrayList
扩容机制
初始容量为0
![]()
(add)扩容容量都是上一次容量的1.5倍
![]()
旧数组长+旧数组长度右移一位(除2)(addAll)
![]()
空数组时,addall 扩容 10 与 实际元素个数 之间的较大值
非空数组时,addall 扩容 1.5倍原容量 与 实际元素个数 之间的较大值
迭代器
fail-fast 不允许在便利时修改list,
![]()
若修改则会使迭代器立即报错![]()
fail-safe 允许并发修改list,但会牺牲一致性
![]()
添加新元素的时候会复制一边数组,读写分离
LinkedList

读取
arrylist 实现了 RandomAccess 接口![]()
所以可以直接可以使用get 获取元素, 效率比(LinkedList 沿着链表遍历找值 )高增删
arrylist 增删会导致数据移动效率会降低,头尾插入没有问题
LinkedList 只有头尾性能高空间占用
arrylist 因为局部性原理,可以避免频繁的内存与缓存的读写
HashMap



单例
并发
常识



sleep | wait

lock | synchronize

volatile


悲观锁,乐观锁

Hashtable | ConcurrentHashMap

ThreadLocal

JVM


内存结构



JVM内存参数




垃圾回收



垃圾回收 | GC



三色标记

并发漏标



内存溢出




双亲委派




四种 引用对象

finalize





Java面向对象有哪些特征
继承、封装、多态、
ArrayList和LinkedList有什么区别
- 一个数组,一个链表
- 插入、删除、访问
Java中抽象类和接口有什么区别
- 语义区别
- 抽象类是一个抽象的概念:动物、食物、
- 接口是一个共同事物的共同特征:会飞的、会发光的、
高并发的集合有哪些问题
- 第一代,默认线程安全,效率很低
- 第二代,非线程安全,ArrayList、HashMap,线程不安全但是效率比较高
- 第三代,线程安全集合类。。。。。。
1.8的新特性有哪些?
Spring
refresh














spring bean











spring 事务失效



spring MVC











