15道核心Java口试题及详细剖析(2)【高频口试考点】
涵盖基础概念、计划模式、多线程、JVM原理等关键范畴。1. HashMap的工作原理及哈希辩论解决
剖析:
[*]数据结构:数组+链表/红黑树(Java 8+,链表长度>8转红黑树)。
[*]哈希计算:(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)。
[*]辩论解决:拉链法(同一桶位链表存储),Java 8优化为链表和红黑树结合。
[*]扩容机制:默认容量16,负载因子0.75,扩容时容量翻倍,重新计算索引(index = (n-1) & hash)。
2. synchronized与ReentrantLock的区别
剖析:
[*]synchronized:JVM内置锁,主动释放,支持锁重入,不可中断,非公平锁。
[*]ReentrantLock:API级别锁,需手动lock()/unlock(),支持公平锁、可中断、超时等候、条件变量。
[*]性能:高竞争场景下,ReentrantLock更优;低竞争时synchronized有JVM优化。
3. JVM内存结构及GC过程
剖析:
[*]内存区域:
[*]堆:对象实例(分年轻代、老年代)。
[*]方法区(元空间):类信息、常量池(Java 8+利用本地内存)。
[*]栈:线程私有,存储方法调用栈帧。
[*]程序计数器:当火线程执行指令地点。
[*]GC过程:
[*]年轻代:Minor GC(复制算法,Survivor区)。
[*]老年代:Major GC/Full GC(标志-打扫/标志-整理)。
4. Java中的强引用、软引用、弱引用、虚引用
剖析:
[*]强引用:Object obj = new Object(),不会被GC回收。
[*]软引用(SoftReference):内存不足时回收,适合缓存。
[*]弱引用(WeakReference):GC时立即回收,如WeakHashMap。
[*]虚引用(PhantomReference):无法通过虚引用获取对象,用于跟踪对象被回收的状态。
5. volatile关键字的作用
剖析:
[*]可见性:写操作立即革新到主内存,读操作从主内存读取。
[*]禁止指令重排序:通过内存屏障(Memory Barrier)实现。
[*]不包管原子性:如volatile int i=0; i++仍需synchronized或AtomicInteger。
6. 线程池的核心参数及工作流程
剖析:
[*]参数:核心线程数、最大线程数、任务队列、拒绝计谋。
[*]流程:
[*]任务数 < 核心线程数 → 新建线程执行。
[*]任务数 > 核心线程数 → 加入队列。
[*]队列满且线程数 < 最大线程数 → 新建线程。
[*]队列满且线程数 >= 最大线程数 → 触发拒绝计谋(如丢弃、抛非常等)。
7. 单例模式的线程安全实现
剖析:
[*]双重查抄锁(DCL): java
public class Singleton {
private volatile static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
[*]静态内部类:利用类加载机制包管线程安全。
[*]枚举单例:最简便且防反射攻击的方式。
8. Java中的非常体系
剖析:
[*]Throwable:全部错误和非常的父类。
[*]Error:系统错误(如OutOfMemoryError),程序无法处理。
[*]Exception:可处理非常。
[*]RuntimeException:未查抄非常(如NullPointerException)。
[*]Checked Exception:编译时查抄(如IOException),必须捕获或声明。
9. 动态署理的实现方式及应用场景
剖析:
[*]JDK动态署理:基于接口,利用InvocationHandler: java
Proxy.newProxyInstance(ClassLoader, interfaces, handler);
[*]CGLIB署理:基于类继续,生成子类覆盖方法。
[*]应用场景:AOP(日记、事务)、RPC调用、权限控制。
10. ConcurrentHashMap的线程安全实现
剖析:
[*]分段锁(Java 7):将数据分段,每段独立加锁。
[*]CAS + synchronized(Java 8+):
[*]插入时利用CAS包管线程安全。
[*]链表头节点用synchronized锁住,避免并发修改。
11. Java中的深拷贝与浅拷贝
剖析:
[*]浅拷贝:Object.clone()默认实现,复制对象引用(原对象和拷贝对象共享引用类型字段)。
[*]深拷贝:需手动实现,通过序列化或递归复制引用对象。 java
public class DeepCopy implements Serializable {
public DeepCopy copy() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (DeepCopy) ois.readObject();
}
}
12. Java 8的Stream API利用场景
剖析:
[*]实用场景:集合数据处理(过滤、映射、排序、聚合)。
[*]示例: java
List<String> names = users.stream()
.filter(u -> u.getAge() > 18)
.map(User::getName)
.sorted()
.collect(Collectors.toList());
[*]特点:链式调用、延迟执行、并行处理(parallelStream())。
13. 类加载机制及双亲委派模型
剖析:
[*]类加载器:
[*]Bootstrap ClassLoader:加载JRE/lib核心类。
[*]Extension ClassLoader:加载JRE/lib/ext扩展类。
[*]Application ClassLoader:加载用户类路径(ClassPath)的类。
[*]双亲委派:类加载哀求先委派父类加载器,避免重复加载,包管核心类安全。
14. 如何避免死锁?
剖析:
[*]死锁条件:互斥、哀求与保持、不可抢占、循环等候。
[*]解决方案:
[*]按固定顺序获取锁(如先锁A再锁B)。
[*]利用tryLock()设置超时时间。
[*]通过JVM检测工具(如jstack)分析线程转储。
15. Spring框架中Bean的作用域
剖析:
[*]Singleton(默认):单例,容器中唯一实例。
[*]Prototype:每次哀求创建新实例。
[*]Request:HTTP哀求生命周期内有效。
[*]Session:HTTP会话生命周期内有效。
[*]Global Session:Portlet应用中的全局会话作用域。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]