内容提要
文章精选九道Java基础面试题并附解析,涵盖JDK概念与版本选择、Java程序编译运行流程、极简程序要素、boolean内存占用、&与&&的区别、int转byte溢出原理、new String创建对象数量、封装特性的体现以及双亲委派类加载机制,强调基础题背后知识深厚,需日积月累。
延伸解读
基础题背后的深度:从面试官视角看考察意图
文章以面试官角度精选九道Java基础题,每道题都指明了考察点,如JDK理解、运行原理、数据类型、运算、字符串机制、封装和类加载等。这提示读者,面试中的基础题并非简单背诵,而是考察对Java底层机制和设计思想的理解深度。回答时若能结合原理展开,更能体现扎实功底。
版本选择与运行流程:体现技术选型与原理掌握
关于JDK版本,作者常用JDK8,理由是稳定且普及,便于解决问题。这反映了技术选型时对生态和稳定性的权衡。而Java程序从编码到运行需经过编译、加载、执行等步骤,理解javac、JRE、JVM的分工,有助于排查问题和优化性能,是开发者必备的基础知识。
细节中的陷阱:boolean内存与int转byte溢出
boolean类型在JVM规范中编译后用int代替(4字节),但boolean数组用byte数组(每元素1字节),实际取决于JVM实现。int转byte时截取低8位,可能导致负数,如129转为-127。这些细节考察对计算机补码和类型转换的理解,提醒开发者注意数据类型的底层表示,避免想当然。
字符串创建与类加载:理解对象机制和安全设计
new String("xxx")可能创建1或2个对象,取决于常量池是否已有该字符串,这涉及字符串常量池和堆内存的交互。双亲委派模式则通过层级委托避免类重复加载,并保护核心API不被篡改。理解这些机制有助于编写高效、安全的代码,也是面试中区分深度的常见考点。
Q&A
JDK 是什么?它包含哪些主要组件?
JDK 全称 Java Development ToolKit,即 Java 语言开发工具包。它包含开发者工具(如 javac 编译 java 源码、jar 打包等),还包含 JRE(Java 运行时环境),JRE 除了运行程序的 java 指令外,还有类库以及执行 Java 应用程序的 JVM。
一个 Java 程序从编写到运行经历了哪些步骤?
首先编写得到 .java 源代码文件;然后用 JDK 中的 javac 命令编译,生成 class 字节码文件;接着用 JRE 的 java 命令执行 class 文件,字节码被传输到 JVM,JVM 合并字节码和库文件一起执行,输出特定硬件平台的机器码;最后机器码被底层物理硬件平台执行。
Java 中的 boolean 类型占用多少内存?
boolean 类型占用 1 字节或 4 字节。在 JVM 规范中,boolean 编译后会被 int 代替,占 4 个字节;如果是 boolean 数组,则每个元素占 1 个字节。实际大小取决于各厂商的 JVM 实现。
Java 中 & 和 && 有什么区别?
&& 是逻辑与运算符,具有短路性,左边为 false 时直接返回 false;& 既能作为逻辑与运算符(无短路性),也能作为按位与运算符(用于二进制计算,两个二进位均为 1 时结果位才为 1)。通常逻辑与使用 &&,& 更多用于位运算。
为什么将 int 类型的 129 强制转换为 byte 后输出 -127?
int 类型占 32 位,byte 占 8 位,转换时截取 int 的后 8 位。129 的补码后 8 位为 1000 0001,作为 byte 的补码,转换为原码是 1111 1111,即十进制的 -127。
执行 new String("xxx") 会创建几个对象?
一个或两个。如果常量池中原来没有 "xxx",则会先在常量池创建一个,再在堆中创建一个拷贝对象,共两个;如果常量池中已有 "xxx",则只会在堆中创建一个对象。
Java 的封装特性体现在哪些方面?
体现在:通过包(package)将模块封装,仅暴露接口;通过访问权限控制实现信息隐藏;通过 getter 和 setter 方法对成员变量进行有条件的读取和修改。
什么是双亲委派模式?它有什么好处?
双亲委派模式要求除引导类加载器外,其余类加载器都有父加载器。收到类加载请求时,先委托父加载器,递归至顶层引导类加载器;父加载器无法完成时才由子加载器尝试。好处是避免类重复加载,并保证 Java 核心 API 不被随意替换,确保安全。