《互联网大厂 Java 求职者面试:从核心知识到分布式组件》

27 阅读4分钟

以下是面试过程:

第一轮: 面试官:请你说说 Java 的核心知识有哪些? 王铁牛:嗯……有面向对象编程的概念,比如封装、继承、多态之类的。 面试官:不错,那你再说说 Java 中的基本数据类型有哪些? 王铁牛:有整数类型 byte、short、int、long,还有浮点类型 float、double,以及字符类型 char 和布尔类型 boolean 。 面试官:很好,那你讲讲 Java 中的访问修饰符有哪些? 王铁牛:有 public、private、protected 和默认(不写修饰符时)。

第二轮: 面试官:接着说说 JUC 中的并发工具类有哪些? 王铁牛:有 CountDownLatch、CyclicBarrier 之类的。 面试官:那你讲讲 CountDownLatch 的用法吧。 王铁牛:呃……这个不太清楚了。 面试官:没关系,那再说说 JVM 中的垃圾回收机制是怎么工作的? 王铁牛:这个……我不太明白。 面试官:没关系,那我们来聊聊多线程吧,多线程有哪些状态? 王铁牛:有新建、就绪、运行、阻塞和死亡状态。

第三轮: 面试官:那你说说线程池的好处有哪些? 王铁牛:嗯……好像能提高效率之类的。 面试官:具体说说怎么提高效率呢? 王铁牛:(挠挠头)不太清楚。 面试官:那你讲讲 ArrayList 和 LinkedList 的区别吧。 王铁牛:(一脸茫然)不知道。 面试官:没关系,今天的面试就到这里吧,你回家等通知吧。

答案:

  • Java 的核心知识:面向对象编程是 Java 的基础,封装可以将数据和操作封装在类中,提高代码的安全性和可维护性;继承允许子类继承父类的属性和方法,实现代码的复用;多态则使得同一个方法在不同的对象上有不同的表现形式。基本数据类型用于存储简单的数据值,整数类型用于表示整数,浮点类型用于表示小数,字符类型用于表示单个字符,布尔类型用于表示真假值。访问修饰符用于控制类、方法和变量的访问权限,public 表示公开访问,private 表示私有访问,protected 表示受保护访问,默认修饰符表示在同一包内可见。
  • JUC 中的并发工具类:CountDownLatch 用于等待一组线程完成任务后再继续执行;CyclicBarrier 用于让一组线程到达某个屏障点后再一起继续执行。CountDownLatch 的用法:创建一个 CountDownLatch 对象并指定计数器的初始值,然后在需要等待的线程中调用 await() 方法,在其他线程完成任务后调用 countDown() 方法递减计数器的值,当计数器的值减为 0 时,等待的线程会继续执行。
  • JVM 中的垃圾回收机制:JVM 会自动回收不再被引用的对象所占用的内存。垃圾回收机制通过标记-清除、复制、标记-整理等算法来回收垃圾对象。标记-清除算法先标记出需要回收的对象,然后统一回收;复制算法将内存分为两块,每次只使用其中一块,当一块内存满了后,将存活的对象复制到另一块内存中,然后清除原来的内存;标记-整理算法先标记出需要回收的对象,然后将存活的对象向一端移动,最后清理掉边界以外的内存。
  • 线程池的好处:线程池可以提高线程的复用性,避免频繁创建和销毁线程的开销;可以控制线程的数量,避免线程过多导致系统资源耗尽;可以对线程进行统一管理和监控,方便进行线程的调度和管理。
  • ArrayList 和 LinkedList 的区别:ArrayList 是基于数组实现的,随机访问效率高,但插入和删除元素效率低;LinkedList 是基于链表实现的,插入和删除元素效率高,但随机访问效率低。ArrayList 的容量可以自动增长,LinkedList 的容量需要手动管理。