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

46 阅读4分钟

以下是面试过程:

第一轮: 面试官:请你简单介绍一下 Java 的核心知识有哪些? 王铁牛:嗯……Java 的核心知识包括面向对象编程的概念,比如封装、继承、多态等,还有基本的数据类型、控制流语句之类的。 面试官:不错,那你说说 Java 中的访问修饰符有哪些? 王铁牛:有 public、private、protected 和默认(不写修饰符时)。 面试官:很好,那你讲讲它们的作用分别是什么? 王铁牛:public 修饰的成员可以在任何地方被访问;private 修饰的成员只能在本类中访问;protected 修饰的成员可以在本类和子类中访问;默认修饰符的成员只能在同一个包内被访问。

第二轮: 面试官:接着聊聊 JUC 相关的知识吧,你知道什么是线程安全吗? 王铁牛:嗯……大概就是多个线程同时访问一个资源时,不会出现数据不一致的情况吧。 面试官:那你说说 Java 中实现线程安全的方式有哪些? 王铁牛:嗯……有同步代码块、同步方法、Lock 接口等。 面试官:那你详细说说同步代码块和同步方法的区别吧。 王铁牛:(挠挠头)这个……不太清楚了。

第三轮: 面试官:再来说说 JVM 吧,你知道 JVM 内存模型吗? 王铁牛:(一脸茫然)不太懂呢。 面试官:那你说说 Java 中的堆和栈分别存储什么? 王铁牛:(更迷茫了)好像不太记得了。 面试官:没关系,今天的面试就到这里吧,你回家等通知吧。

答案:

  • Java 核心知识:
    • 面向对象编程:封装是将数据和操作封装在一个类中,对外隐藏内部实现细节;继承是子类继承父类的属性和方法;多态是同一操作作用于不同的对象可以有不同的表现形式。基本数据类型有 byte、short、int、long、float、double、char、boolean 等。控制流语句包括条件判断语句(if-else、switch-case)、循环语句(for、while、do-while)等。
    • 访问修饰符:public 用于公开访问,可在任何地方被访问;private 用于私有访问,仅在本类中可见;protected 用于子类和同包类访问;默认修饰符(不写修饰符)用于同包类访问。
  • JUC:
    • 线程安全:指在多线程环境下,对共享资源的访问和操作能够保持一致性和正确性,避免出现数据竞争和不一致的情况。
    • 实现线程安全的方式:
      • 同步代码块:通过 synchronized 关键字修饰代码块,控制对共享资源的同步访问。格式为 synchronized (锁对象) { // 同步代码块 },锁对象可以是任意对象,多个线程在访问同步代码块时,必须先获取到锁对象才能进入。
      • 同步方法:在方法声明中使用 synchronized 关键字,该方法在同一时间只能被一个线程访问。格式为 public synchronized void method() { // 方法体 }
      • Lock 接口:通过显示定义锁对象来实现线程同步,相比同步代码块和同步方法更加灵活。常用的实现类有 ReentrantLock。例如 ReentrantLock lock = new ReentrantLock(); lock.lock(); // 获取锁 try { // 临界区代码 } finally { lock.unlock(); // 释放锁 }
  • JVM:
    • JVM 内存模型:JVM 主要分为堆、栈、方法区等几个部分。
      • 堆:用于存储对象实例和数组,是垃圾回收的主要区域。堆分为新生代和老年代,新生代又分为 Eden 区、From Survivor 区和 To Survivor 区。对象首先在 Eden 区分配,经过多次垃圾回收后,如果对象仍然存活,会被移动到老年代。
      • 栈:用于存储线程的方法调用栈帧,每个方法调用都会创建一个栈帧,包含局部变量、操作数栈、方法出口等信息。栈的特点是线程私有,先进后出。
      • 方法区:用于存储类信息、常量、静态变量、即时编译器编译后的代码等。方法区是共享区域,被所有线程共享。