以下是面试对话:
第一轮: 面试官:请你简单介绍一下 Java 的核心知识有哪些? 王铁牛:Java 的核心知识包括面向对象编程的三大特性:封装、继承、多态,还有基本数据类型、引用数据类型等。 面试官:不错,那你说说 Java 中的基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这八种。 面试官:很好,那引用数据类型呢? 王铁牛:像类、接口、数组等都是引用数据类型。
第二轮: 面试官:接着说说 JUC 相关的知识吧,你知道 Java 中的并发包有哪些? 王铁牛:有 java.util.concurrent 包,里面包含了很多并发工具类。 面试官:那你说说 CountDownLatch 是做什么用的? 王铁牛:它主要用于线程间的同步,通过计数器来控制线程的等待和唤醒。 面试官:那 CyclicBarrier 又有什么作用呢? 王铁牛:它能让一组线程到达一个屏障点后被阻塞,直到所有线程都到达屏障点才继续执行。
第三轮: 面试官:再说说 JVM 方面的知识吧,你知道 JVM 的内存结构吗? 王铁牛:知道,有堆、栈、方法区等。 面试官:那堆又分为哪几种呢? 王铁牛:分为新生代和老年代。 面试官:新生代又分为哪几个区域呢? 王铁牛:分为 Eden 区、From Survivor 区和 To Survivor 区。
面试官:今天的面试就到这里,你可以先回去等通知,我们会尽快给你回复。
答案:
- Java 的核心知识:
- 面向对象编程的三大特性:封装是将数据和操作封装在一个类中,对外提供接口来访问和修改数据,提高了代码的安全性和可维护性;继承是子类继承父类的属性和方法,实现代码的复用和扩展;多态是指同一个行为具有多个不同表现形式,通过父类引用指向子类对象来实现。
- 基本数据类型:byte 占 1 个字节,范围是-128 到 127;short 占 2 个字节,范围是-32768 到 32767;int 占 4 个字节,范围是-2147483648 到 2147483647;long 占 8 个字节,范围非常大;float 占 4 个字节,用于表示单精度浮点数;double 占 8 个字节,用于表示双精度浮点数;char 占 2 个字节,用于表示字符;boolean 占 1 位,只有 true 和 false 两个值。
- 引用数据类型:类是对象的模板,通过类可以创建多个对象;接口是一种规范,定义了一组方法的签名,类实现接口后必须实现接口中的方法;数组是相同类型数据的集合,可以存储多个元素。
- JUC 相关知识:
- java.util.concurrent 包:这个包提供了很多用于线程并发编程的工具类和框架,方便开发人员实现高效的多线程程序。
- CountDownLatch:通过一个计数器来控制线程的等待和唤醒。初始化时设置计数器的初始值,当计数器的值减为 0 时,所有等待的线程将被唤醒。常用于主线程等待子线程执行完毕后再继续执行的场景。
- CyclicBarrier:它可以让一组线程到达一个屏障点后被阻塞,直到所有线程都到达屏障点才继续执行。与 CountDownLatch 不同的是,CyclicBarrier 可以重复使用,而 CountDownLatch 只能使用一次。
- JVM 的内存结构:
- 堆:是 JVM 管理的最大的一块内存区域,用于存储对象实例和数组。堆分为新生代和老年代,新生代又分为 Eden 区、From Survivor 区和 To Survivor 区。新生代存储新创建的对象,经过几次垃圾回收后仍然存活的对象将被移动到老年代。
- 栈:用于存储线程的局部变量、方法参数和返回值等。每个线程都有自己的栈,栈的大小相对较小,存储的变量生命周期较短。
- 方法区:用于存储类的信息、常量、静态变量、即时编译器编译后的代码等。方法区是共享的内存区域,多个线程可以共享其中的信息。