《互联网大厂 Java 求职者面试:从核心知识到框架技术》

41 阅读4分钟

以下是面试对话内容:

第一轮: 面试官:请你简述一下 Java 的核心知识有哪些? 王铁牛:嗯……Java 的核心知识包括数据类型、控制结构、面向对象编程等。 面试官:很好,那你能说说面向对象编程的三大特性是什么吗? 王铁牛:封装、继承、多态。 面试官:不错,那你在实际项目中是如何运用这些特性的呢? 王铁牛:(思考片刻)在我们的项目中,通过封装将数据和操作封装在类中,提高了代码的安全性和可维护性;利用继承实现了代码的复用,减少了重复代码;通过多态可以根据不同的对象类型执行不同的操作,增加了代码的灵活性。

第二轮: 面试官:接着我们来谈谈 JUC 相关的知识,你知道什么是线程安全吗? 王铁牛:嗯,线程安全就是多个线程同时访问一个资源时,不会出现数据不一致的情况。 面试官:那你说说在 Java 中如何实现线程安全呢? 王铁牛:可以使用同步代码块或者同步方法来保证线程安全。 面试官:很好,那你能举例说明在什么情况下使用同步代码块,什么情况下使用同步方法吗? 王铁牛:(挠挠头)这个……不太清楚。

第三轮: 面试官:再来说说 JVM 吧,你知道 JVM 的内存结构吗? 王铁牛:嗯……好像有堆、栈、方法区之类的。 面试官:非常好,那你能详细说说堆和栈的区别吗? 王铁牛:(犹豫了一下)堆是用来存储对象的,栈是用来存储局部变量和方法调用的。 面试官:不错,那你知道垃圾回收是怎么工作的吗? 王铁牛:(一脸茫然)不太清楚。

面试官:今天的面试就到这里吧,你回去等通知吧。

答案:

  • Java 的核心知识:
    • 数据类型:Java 有基本数据类型(如 int、double、char 等)和引用数据类型(如类、接口、数组等)。基本数据类型直接存储值,引用数据类型存储对象的引用。
    • 控制结构:包括条件语句(if-else、switch-case 等)、循环语句(for、while、do-while 等),用于控制程序的流程。
    • 面向对象编程:三大特性为封装、继承、多态。封装将数据和操作封装在类中,隐藏内部实现细节;继承是子类继承父类的属性和方法,实现代码复用;多态允许不同的子类对象对同一消息做出不同的响应。
  • JUC 中实现线程安全的方式:
    • 同步代码块:通过 synchronized 关键字修饰代码块,指定同步监视器(通常是对象),同一时刻只有一个线程能进入同步代码块。例如:
synchronized (obj) {
    // 同步代码块
}
- 同步方法:在方法声明中使用 synchronized 关键字,整个方法体在同一时刻只能被一个线程访问。例如:
public synchronized void method() {
    // 方法体
}

在使用同步代码块时,如果同步监视器不同,多个线程可以同时进入不同的同步代码块;而同步方法则是针对整个方法,同一时刻只有一个线程能执行该方法。

  • JVM 的内存结构:
    • 堆:是 JVM 管理的最大的一块内存区域,用于存储对象实例和数组。堆分为新生代和老年代,新生代又分为 Eden 区、From Survivor 区和 To Survivor 区。对象首先在 Eden 区分配,经过一定次数的垃圾回收后,如果仍然存活,将被移动到老年代。
    • 栈:用于存储局部变量、方法参数和方法调用帧。每个线程都有自己的栈,栈的大小是固定的,方法调用时会创建栈帧,方法执行结束后栈帧被弹出。
    • 方法区:存储类信息、常量、静态变量、即时编译器编译后的代码等。方法区是共享的内存区域,被所有线程共享。
  • 垃圾回收工作原理:
    • 垃圾回收器会周期性地扫描堆内存中的对象,判断哪些对象是可达的(可以通过引用链访问到的对象),哪些对象是不可达的(无法通过引用链访问到的对象)。
    • 对于不可达的对象,垃圾回收器会将其标记为可回收对象,并在合适的时机进行回收。回收过程包括清理对象占用的内存空间,并将其归还给堆内存。
    • Java 中有多种垃圾回收算法,如标记-清除算法、复制算法、标记-整理算法等,不同的算法适用于不同的场景。垃圾回收器会根据堆内存的使用情况和对象的生命周期等因素选择合适的算法进行垃圾回收。