以下是面试过程:
第一轮: 面试官:请你谈谈 Java 的基本数据类型有哪些? 王铁牛:有 byte、short、int、long、float、double、char、boolean 这几种。 面试官:很好,那你说说这些数据类型在内存中的存储方式有什么区别? 王铁牛:嗯……这个好像不太清楚。 面试官:那再问你,Java 中的面向对象特性有哪些? 王铁牛:有封装、继承、多态。 面试官:不错,那封装的作用是什么呢? 王铁牛:好像是把数据和操作封装在一起,对外提供接口吧。
第二轮: 面试官:讲讲 JUC 中的常用类有哪些? 王铁牛:有 CountDownLatch、CyclicBarrier 之类的。 面试官:那 CountDownLatch 主要用于什么场景呢? 王铁牛:这个……不太确定。 面试官:再说说 JVM 的内存区域划分吧。 王铁牛:有堆、栈、方法区等。 面试官:那堆内存和栈内存的区别是什么呢? 王铁牛:不太清楚,好像堆内存是用来存储对象的,栈内存是存储局部变量的。
第三轮: 面试官:谈谈多线程的创建方式有哪些? 王铁牛:有继承 Thread 类和实现 Runnable 接口这两种。 面试官:那它们有什么区别呢? 王铁牛:嗯……不太明白。 面试官:再问你,线程池的作用是什么? 王铁牛:好像是可以提高线程的复用性和管理线程吧。 面试官:很好,那常用的线程池有哪些? 王铁牛:有 ThreadPoolExecutor、CachedThreadPool 等。 面试官:不错,那你说说 ThreadPoolExecutor 的参数含义吧。 王铁牛:这个……不太清楚。
总结:今天的面试就到这里,你回去等通知吧。希望你能在后续的学习中不断提升自己的技术水平。感谢你的参与。
答案:
- Java 的基本数据类型:
- byte:字节型,占 1 个字节,范围是 -128 到 127。
- short:短整型,占 2 个字节,范围是 -32768 到 32767。
- int:整型,占 4 个字节,范围是 -2147483648 到 2147483647。
- long:长整型,占 8 个字节,范围是很大的整数。
- float:单精度浮点数,占 4 个字节。
- double:双精度浮点数,占 8 个字节。
- char:字符型,占 2 个字节,存储 Unicode 字符。
- boolean:布尔型,占 1 位,只有 true 和 false 两个值。
- JUC 常用类:
- CountDownLatch:用于线程间的同步,例如一个线程等待其他多个线程完成任务后再继续执行。
- CyclicBarrier:也用于线程间的同步,多个线程到达屏障点后一起继续执行。
- JVM 内存区域划分:
- 堆:是 Java 虚拟机所管理的内存中最大的一块,用于存储对象实例和数组等。所有线程共享堆内存。
- 栈:每个线程都有一个私有的栈,用于存储局部变量、方法参数、操作数栈等。栈的大小相对较小,遵循先进后出的原则。
- 方法区:存储类信息、常量、静态变量、即时编译器编译后的代码等。
- 多线程创建方式:
- 继承 Thread 类:通过继承 Thread 类并重写 run() 方法来创建线程,启动线程时直接调用 start() 方法。
- 实现 Runnable 接口:创建一个实现 Runnable 接口的类,重写 run() 方法,然后将该类的实例作为参数传递给 Thread 类的构造函数来创建线程,最后调用 start() 方法启动线程。
- 实现 Callable 接口:与 Runnable 类似,但 Callable 接口的 run() 方法有返回值,并且可以抛出异常。可以使用 FutureTask 来包装 Callable 对象,以便在另一个线程中获取结果。
- 线程池的作用:
- 提高线程的复用性:避免频繁创建和销毁线程,减少系统开销。
- 管理线程:可以对线程进行统一的管理,如设置线程的数量、优先级等。
- 控制并发度:限制同时执行的线程数量,避免系统资源过度消耗。
- ThreadPoolExecutor 的参数含义:
- corePoolSize:核心线程数,即线程池中的常驻线程数量。
- maximumPoolSize:最大线程数,线程池允许创建的最大线程数量。
- keepAliveTime:线程空闲时的存活时间,当线程池中的线程数量超过 corePoolSize 时,多余的线程会在空闲时间后被销毁。
- unit:keepAliveTime 的时间单位。
- workQueue:任务队列,用于存储待执行的任务。常用的队列有 LinkedBlockingQueue、ArrayBlockingQueue 等。
- threadFactory:线程工厂,用于创建新的线程。
- handler:拒绝策略,当任务队列已满且线程池中的线程都在工作时,如何处理新提交的任务。常用的拒绝策略有 AbortPolicy、CallerRunsPolicy、DiscardPolicy 等。