徐锦洪 发表于 2025-3-27 06:03:55

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]
查看完整版本: 15道核心Java口试题及详细剖析(2)【高频口试考点】