以下是面试过程:
第一轮: 面试官:请你简述一下 Java 的核心知识有哪些? 王铁牛:Java 的核心知识包括面向对象编程的概念,如封装、继承、多态等,还有基本数据类型、控制结构等。 面试官:不错,那你说说 Java 中的访问修饰符有哪些? 王铁牛:有 public、private、protected 和 default 这几种。 面试官:很好,那你讲讲它们的作用分别是什么? 王铁牛:public 修饰的成员可以在任何地方访问;private 修饰的成员只能在本类中访问;protected 修饰的成员可以在本类和子类中访问;default 修饰的成员在同一个包内可以访问。
第二轮: 面试官:谈谈你对 JUC(Java 并发包)的理解吧。 王铁牛:JUC 主要是用于处理多线程编程相关的问题,提供了很多并发工具类。 面试官:那你说说常用的并发工具类有哪些? 王铁牛:有 CountDownLatch、CyclicBarrier、Semaphore 等。 面试官:能分别说一下它们的用途吗? 王铁牛:CountDownLatch 用于线程间的同步,当一个线程等待其他多个线程完成某个操作后再继续执行;CyclicBarrier 用于多个线程之间相互等待,达到某个条件后一起继续执行;Semaphore 用于控制同时访问某个资源的线程数量。
第三轮: 面试官:讲讲你对 JVM(Java 虚拟机)的了解吧。 王铁牛:JVM 是 Java 程序的运行环境,它负责将字节码解释成机器码并执行。 面试官:那 JVM 内存结构有哪些部分? 王铁牛:有堆、栈、方法区等。 面试官:它们分别的作用是什么? 王铁牛:堆用于存储对象实例,是垃圾回收的主要区域;栈用于存储方法调用的局部变量、参数等,线程私有;方法区用于存储类的信息、常量、静态变量等。
面试官:今天的面试就到这里,你可以先回去等通知,我们会尽快给你回复。
答案:
- Java 的核心知识:面向对象编程的概念(封装、继承、多态等)、基本数据类型、控制结构等。这些是 Java 编程的基础,封装可以隐藏对象的内部实现细节,提高代码的安全性和可维护性;继承可以实现代码的复用,子类继承父类的属性和方法;多态可以使不同的对象对同一消息做出不同的响应,增加了代码的灵活性。
- JUC 常用工具类及用途:
- CountDownLatch:用于线程间同步,例如在一个线程等待多个线程完成某个操作后再继续执行,就可以使用 CountDownLatch。它通过一个计数器,初始值为线程的数量,每个线程完成操作后调用 countDown 方法递减计数器,当计数器减为 0 时,等待的线程就可以继续执行。
- CyclicBarrier:用于多个线程之间相互等待,达到某个条件后一起继续执行。比如在一个游戏中,多个玩家准备好后一起开始游戏,就可以使用 CyclicBarrier。它通过一个计数器,初始值为参与线程的数量,每个线程到达屏障时调用 await 方法,当所有线程都到达屏障后,一起继续执行后续操作,然后计数器重置,可重复使用。
- Semaphore:用于控制同时访问某个资源的线程数量。例如在数据库连接池中,限制同时访问数据库的连接数,就可以使用 Semaphore。它通过一个许可证计数器,初始值为允许同时访问的线程数量,每个线程获取许可证后才能访问资源,使用完后释放许可证。
- JVM 内存结构及作用:
- 堆:是 Java 虚拟机管理的最大的一块内存区域,用于存储对象实例。所有对象实例以及数组都在堆上分配内存。堆是垃圾回收的主要区域,垃圾回收器会自动回收不再被引用的对象所占用的内存。
- 栈:每个线程都有一个私有的栈,用于存储方法调用的局部变量、参数、返回地址等。栈的特点是后进先出,方法调用时会创建一个栈帧,用于存储方法的局部变量和操作数栈等信息,方法执行完毕后栈帧会被弹出。
- 方法区:用于存储类的信息(如类的字节码、常量池、静态变量等)、运行时常量池、即时编译器编译后的代码等。方法区是各个线程共享的内存区域。