面试官:请简要介绍一下 Java 核心知识都包含哪些方面?
王铁牛:嗯……Java 核心知识嘛,有面向对象、数据类型、控制结构这些吧。
面试官:那你说说面向对象的三大特性是什么?
王铁牛:这个我知道,是封装、继承、多态。
面试官:不错,回答正确。接下来问你关于 JUC 的问题,什么是 CAS?
王铁牛:CAS 嘛,就是比较并交换,好像是一种并发控制的技术。
面试官:具体讲讲它的原理呢?
王铁牛:呃……这个,就是先比较,再交换,看当前值和预期值一不一样,一样就交换。
面试官:好吧,下一个问题,JVM 的内存结构分为哪几个部分?
王铁牛:有堆、栈、方法区。
面试官:那堆内存又分为哪几块?
王铁牛:嗯……不太清楚,好像有新生代、老年代。
面试官:第一轮面试到此为止,回家等通知吧。
答案:
- 面向对象的三大特性:
- 封装:将数据和操作数据的方法封装在一起,对外提供统一的接口,提高数据的安全性和程序的可维护性。比如一个类中的成员变量可以用 private 修饰,通过 public 的方法来访问和修改。
- 继承:子类继承父类的属性和方法,实现代码的复用。比如一个子类可以继承父类的共有方法,无需重新编写。
- 多态:同一个行为具有多个不同表现形式或形态的能力。比如一个父类的引用可以指向不同子类的对象,调用同一个方法时会执行不同子类的实现。
- CAS(比较并交换):
- 原理:它是一种无锁的原子操作。在操作数据时,先比较内存中的值和预期值是否相等,如果相等,则将内存中的值替换为新的值,否则不做任何操作。这种机制可以在不使用锁的情况下实现线程安全的原子操作,提高并发性能。
- JVM 的内存结构:
- 堆:是 JVM 中最大的一块内存区域,用于存储对象实例。堆又分为新生代、老年代和永久代(Java8 之后为元空间)。
- 新生代:主要用于存放新创建的对象,又分为 Eden 区和两个 Survivor 区。新对象首先在 Eden 区创建,当 Eden 区满时,会触发 Minor GC,将存活的对象复制到其中一个 Survivor 区,当一个 Survivor 区满时,会将存活对象复制到老年代或者另一个 Survivor 区。
- 老年代:存放生命周期较长的对象。当新生代对象经过多次垃圾回收后仍然存活,就会被晋升到老年代。
- 永久代(元空间):主要存放类的元数据信息,如类的字节码、常量池等。Java8 之后,永久代被元空间取代,元空间使用本地内存,不受 JVM 堆大小的限制。
- 栈:每个线程都有自己独立的栈空间,用于存储局部变量、方法调用等。栈中的数据是线程私有的,并且遵循先进后出的原则。
- 方法区:存储已被虚拟机加载的类信息、常量、静态变量等数据。方法区是各个线程共享的内存区域。
- 堆:是 JVM 中最大的一块内存区域,用于存储对象实例。堆又分为新生代、老年代和永久代(Java8 之后为元空间)。