Java面试笔记,看完不进大厂都拿难
2021-04-19 11:50:53 20 举报
AI智能生成
个人整理2个月的面试题集,以及笔记
作者其他创作
大纲/内容
消息中间件MQ
NoSQL数据库Redis
Netty+RPC
网络通信与协议
Spring Boot+SpringCloud+Dubbo
项目
Java基础
final关键字用法
说明:最终的,不可变的
final修改的类:不可被继承
final修饰的方法:不可被重写
final修饰的变量:不可重新赋值
final修饰对象:该对象不能被重新指向
final修饰的成员变量:必须手动初始化,不可采用系统的默认值
final修饰的实例变量:最好是用static修饰(存储在方法区),因为final修饰的变量本来就不可重新赋值
static final 关键字修饰的变量称为常量
什么是不可变类?
所有基本类型的包装类都是不可变的
String为什么是不可变的?
String 类是final关键字修饰的类
String 实际是由一个final 修饰的char[]数组存储数据的
==、equal有什么区别?
你知道运算符&和&&、|和||的区别吗?
用最有效率的方法计算2乘以8
String、StringBuffffer与StringBuilder的区别?分别在哪些场景下使⽤?
Java容器
说下Vector和ArrayList、LinkedList联系和区别?分别的使⽤场景
List
Set
Map
抽象类
有构造方法,但是不可被实例化,可提供子类使用
抽象类的子类可以是抽象类
final和abstract不能同时使用,这关键字两个是对立的
抽象类可以没有抽象方法,但是抽象方法必须是在抽象类中
子类继承了抽象类,那么子类必须重写抽象类的抽象方法
Java中凡是没有方法体的方法都是抽象方法吗?
不对,Object中很多native修饰的方法没有方法体,但是他们不是抽象方法
native关键字修饰的方法:调用底层c++写的代码
native关键字修饰的方法:调用底层c++写的代码
接口
可以继承多个接口
接口中的变量都是常量(static final 关键字修饰的)
interface中可以有static⽅法,但必须有⽅法实现体,该⽅法只属于该接⼝,接⼝名直接调⽤
该⽅法
该⽅法
接⼝中新增default关键字修饰的⽅法,default⽅法只能定义在接⼝中,可以在⼦类或⼦接⼝
中被重写default定义的⽅法必须有⽅法体
中被重写default定义的⽅法必须有⽅法体
深拷贝和浅拷贝
包装类可以被继承吗?
不可以,包装类都用final关键字修饰
JUC多线程及高并发
基础内容
synchronized和Lock有什么区别?用新的Lock有什么好处?
区别
原始构成
synchronized是关键字属于JVM层面
Lock是具体的类(ava.util.concurrent.locks.Lock)是api层面的锁
如何释放锁?
synchronized不需要手动释放锁,业务代码执行完以后系统会自动释放对锁的占有
Lock需要手动释放锁,如果没能成功手动释放锁,可能会导致死锁的现象
需要lock()和unLock()配合try和finally语句块来完成
需要lock()和unLock()配合try和finally语句块来完成
是否可被中断
synchronized不可被中断,除非抛异常或程序正常执行完成
ReentrantLock可以被中断
加锁是否公平
synchronized:非公平锁
ReentrantLock:默认为非公平锁,可以传入一个人boolean型的参数,true为公平锁,false为非公平锁
是否可绑定多个条件
synchronized:没有
ReentrantLock可以分组唤醒需要唤醒的线程,可以精准唤醒
而不像synchronized那样要么随机唤醒一个线程要么全部唤醒
而不像synchronized那样要么随机唤醒一个线程要么全部唤醒
好处
为什么wait, notify 和 notifyAll这些方法不在thread类里面?
sleep与wait的区别
进阶内容
谈谈对volatitle的理解
volatile是Java虚拟机提供的轻量级的同步机制
可见性
案例代码
不具有原子性
禁止指令重排
谈谈JMM
可见性
原子性
有序性
禁止指令重排
java.util.concurrent.atomic 演示可见性+原子性代码
案例代码
你在哪些地方用到过volatie?
单例模式DCL代码
案例代码
单例模式volatile分析
读写锁手写缓存的时候
JUC包里大规模都有使用
CAS算法你知道吗?
比较并交换
CAS底层原理?如果知道,谈谈你对UnSafe的理解
atomicInteger.getAndIncrement();
底层代码
UnSafe
底层源码
CAS是什么?
unsafe.getAndAddInt();
底层汇编
为什么用CAS不用Synchronized?
CAS缺点
自旋对比时间长CPU开销大
只能保证共享变量的原子操作,其他业务代码无法保证
ABA问题?
谈谈原子类AtomicInteger的ABA问题,原子更新引用知道吗?
ABA问题怎么产生的(狸猫换太子)
原子引用 AtomicReference<V>
解决 “ABA”问题 - 时间戳原子引用
我们知道ArrayList是线程不安全,请编写一个不安全的案例,并给出解决方案
案例代码
解决方案
使用Vector集合
使用Collections.synchronizedList(new ArrayList<T>());
CopyOnWriteArrayList<T>(); - 写时复制容器
谈谈对公平锁/非公平锁/可重入锁递归锁/自旋锁的理解,请写一个自旋锁
公平锁/非公平锁
是什么?
两者区别?
可重入锁(递归锁)
是什么?
ReentrantLock/synchronized就是经典的可重入锁
可重入锁的最大作用就是避免死锁
自旋锁
独占锁(写锁)/共享锁(读锁)/互斥锁
ReentrantReadWriteLock
CountDownLatch/CyclicBarrier/Semaphone使用过吗?
CountDownLatch - 计数类
让一些线程阻塞,直到另一些线程完成了操作才会被唤醒
CountDownlatch有两个核心方法,当一个或多个线程调用await()方法时,调用的线程会进入阻塞状态。
其他线程调用countDown()方法时会使计算器减1(调用countDown方法的线程不会阻塞),当计数器为0时,因调用await()方法被阻塞的线程会被唤醒,继续执行
其他线程调用countDown()方法时会使计算器减1(调用countDown方法的线程不会阻塞),当计数器为0时,因调用await()方法被阻塞的线程会被唤醒,继续执行
CyclicBarrier(与CountDownLatch相反)
Semaphone - 信号量
阻塞队列知道吗?
有什么好处?
种类分析
ArrayBlockingQueue:由数组结构组成的有界阻塞队列
LinkedBlockingQueue:由链表组成的有界(默认大小:integer.Max_value)阻塞队列
SynchronousQueue:不存储元素的阻塞同步队列
理论
示例代码
阻塞队列用在哪里?
生产者消费者模式
传统版
Condition多条件
阻塞队列版
线程池
消息中间件
线程池使用过吗? 谈谈你对ThreadPoolExecutor的理解?
线程池在生产时如何设置合理参数?
死锁编码以及定位分析
JVM+GC解析
数据结构与算法
线性结构
存储结构
顺序存储(顺序表)
链式存储(链表)
常见的线性结构有哪些?
数组、队列、链表、栈
非线性结构
常见的非线性结构有哪些?
二维数组、多维数组、广义表、树结构、图结构
什么是稀疏数组?
排序
简单排序
冒泡排序O(N^2)
插入排序O(N^2)
选择排序O(N^2)
为什么Mysql的索引不用二叉树数据结构?
哪些场景不适合用二叉树红黑树这样的数据结构?
数据量大,可能导致树的高度很大,而且刚好要查找的元素位于叶子节点
数据库
索引是什么?
索引是帮助Mysql高效获取数据的排好序的数据结构
为什么Mysql使用B+Tree数据结构而不是用B-Tree?
因为大部分情况都需要范围查找,然而B+Tree每个叶子结点都用指针连接,区间访问的性能更高
介绍一下mysql的存储引擎是什么?
MyISAM存储引擎
后缀MYD存储表数据的 MYI存储索引的
索引文件和数据文件是分离的(非聚集)
非聚集索引 - (索引和数据分开存储)
InnoDB存储引擎
表数据文件本身就是按B+Tree组织的索引结构文件
聚集索引(索引和数据存储在一个地方) - 叶子节点包含了完整的数据记录
数据文件和索引文件都存储在后缀为idb的文件
Spring原理
IOC 控制反转
如何使用静态工厂和实例工厂实例化bean?
静态工厂的实例化
实例工厂的实例化
Bean的作用域
Spring AOP
Spring AOP的顺序
AOP的常用注解
@Befare
前置通知:目标方法执行之前
@After
后置通知:目标方法执行之后
@AfterReturning
返回后通知:执行方法结束之前(异常不执行)
@AfterThrowing
异常通知:出现异常时执行
@Around
环绕通知:环绕目标方法执行
Spring AOP的循环依赖
Spring是如何处理线程的并发问题的?
Spring的事务管理
事务的四个特性分别是什么ACID?
事务的并发会产生的问题有哪些?
事务隔离级别有哪些?
收藏
收藏
0 条评论
下一页