面试模拟-202508

Gemini模拟面试2025.7.29

1.Java面向对象的基本特性:

总:的介绍一下java面向对象

分:封装,继承,多态

总:好处

2.Hashmap的原理

总:hashmap是个啥

分:

  1. 基本数据结构类型,1.7 or 1.8

  2. hash冲突解决

  3. 核心put过程

  4. 扩容机制,为什么是2倍

  5. 线程安全实现

  6. concurrenthashmap

  7. 平时使用场景

3.ArrayList 和 LinkedList 的区别

  1. 底层数据结构
  2. 插入删除遍历节点
  3. 扩容
  4. 使用场景:

4.常用的设计模式

  1. 单例:饿汉式,懒汉式,DCL 枚举 实际应用,RedisClient AppConfig Spring bean
  2. 策略:
  3. 模板
  4. 观察
  5. 工厂

5.ThreadLocal的实现

  1. 底层数据结构

Threalocal涉及两个组件,一个是他对象本身负责set和get

然后一个ThreadLocalMap负责数据的存储,每一个线程都持有一个ThreadLocalMap他就是副本。是线程隔离的,不会有并发的线程不安全问题

ThreadLocalMap是Thread下面的一个内部类,使用了自定义的散列表来存储键值对,key为实例,value是为具体的对象

然后ThreadLocalMapEntry 是用 WeakReference 来存储 ThreadLocal 对象实例,这样可以避免 ThreadLocal 对象不会因为强引用而无法被垃圾回收。但需要注意的是,value 是一个强引用,如果 ThreadLocal 没有正确清理,就可能导致内存泄漏的问题。然后我们如果想回收内存的话,需要显示的调用remove方法移除。或者是查找当前线程关联的map,将其键值对分别设为当前线程和null

  1. 内存泄漏问题

  2. 使用场景

6.你如何理解“悲观锁与乐观锁”?分别适用哪些场景?CAS 原理是什么?

  1. 悲观锁,乐观锁代表什么,实例,场景
  2. CAS原理,OS的cmpxchg
  3. CAS问题
  4. 使用场景

7.说一下 Java 中的 synchronized 关键字的实现原理、优化机制,以及它和 ReentrantLock 的区别

  1. 底层原理,对象头中的 monitor 锁,每个对象在 JVM 中都有一个对象头,包含了锁标志位和指向 monitor 的指针。当线程进入 synchronized 块或方法时,会尝试获得这个对象的 monitor。多线程竞争时,会进行 锁的升级,这就是 HotSpot 中的锁优化。
  2. 锁的升级过程,无锁->偏向锁->轻量级锁->重量级锁
  3. ReentrantLock 对比

8.说一下 Java 中的 volatile 关键字的作用,它能实现线程安全吗?它和 synchronized 有什么区别?

  1. 可见性,禁止重排性

  2. 不能保证原子下,i++

  3. 和JMM的关系:JMM规定了主内存和工作内存的交互规则,volatile 会强制线程刷新工作内存和主内存之间的数据。

    写 volatile → 插入一个 Store + StoreBarrier 。读 volatile → 插入一个 LoadBarrier + Load

  4. 应用场景,标识位,布尔控制变量,DCL

  5. synchronized 对比

MYDB项目