Java面试高频考点全解析:从基础语法到核心原理

一、架构设计基础

1. B/S与C/S架构对比
B/S(Browser/Server)架构通过浏览器访问服务端,具有跨平台特性,典型应用如Web应用;C/S(Client/Server)架构需安装客户端软件,交互性更强,常见于桌面应用。现代开发中,B/S架构因维护成本低、扩展性强成为主流选择,而C/S架构在需要高性能图形渲染的场景(如游戏开发)仍有应用。

2. Java开发平台选择
主流开发平台包括标准版Java SE(适用于桌面应用开发)、企业版Java EE(现Jakarta EE,用于分布式系统开发)和移动版Java ME(已逐渐被Android取代)。开发者应根据项目需求选择平台,例如构建微服务架构时,Spring Boot框架结合Java SE即可满足需求。

二、Java环境与核心组件

3. JDK与JRE的组成关系
JDK(Java Development Kit)包含JRE(Java Runtime Environment)和开发工具(如javac编译器),而JRE仅提供JVM、核心类库和运行支持文件。安装JDK后无需单独安装JRE,该设计体现了”开发-运行”分离的工程思想。

4. Java语言特性解析

  • 跨平台性:通过JVM实现”一次编写,到处运行”
  • 面向对象:支持封装、继承、多态三大特性
  • 自动内存管理:垃圾回收机制减少内存泄漏风险
  • 异常处理:强制要求捕获检查型异常
  • 多线程支持:内置Thread类和同步机制

三、数据类型与转换机制

5. 基本数据类型分类
Java定义8种基本类型:

  • 整数:byte(1B)、short(2B)、int(4B)、long(8B)
  • 浮点:float(4B)、double(8B)
  • 字符:char(2B,Unicode编码)
  • 布尔:boolean(未明确规定大小)

6. 隐式转换与显式转换规则
自动类型转换(隐式)遵循”小容量向大容量”原则,例如:

  1. int i = 100;
  2. double d = i; // 合法

强制类型转换(显式)需显式声明目标类型,可能造成精度丢失:

  1. double d = 3.14;
  2. int i = (int)d; // i=3

7. 包装类与拆装箱机制
8种基本类型对应8个包装类(如Integer对应int),自动拆装箱通过编译器插入字节码实现:

  1. Integer obj = 100; // 自动装箱
  2. int primitive = obj; // 自动拆箱

需注意数值范围检查(如Integer缓存-128~127)和空指针风险。

四、面向对象核心概念

8. 类与对象的工程实践
类是对象的模板,包含:

  • 字段(成员变量)
  • 方法(成员函数)
  • 构造器(初始化对象)
  • 代码块(静态/实例初始化)
  • 内部类(嵌套类定义)

9. 访问修饰符作用域
| 修饰符 | 当前类 | 同一包 | 子类 | 其他包 |
|——————|————|————|———|————|
| public | √ | √ | √ | √ |
| protected | √ | √ | √ | × |
| default | √ | √ | × | × |
| private | √ | × | × | × |

10. 重载与重写区别
重载(Overload)发生在同一类中,要求方法名相同但参数列表不同(类型/顺序/数量),与返回值无关。重写(Override)发生在继承关系中,要求方法签名完全相同,访问权限不能更严格,抛出异常不能更宽泛。

五、常见问题深度解析

11. 浮点数精度问题解决方案
使用BigDecimal类进行精确计算:

  1. BigDecimal a = new BigDecimal("0.1");
  2. BigDecimal b = new BigDecimal("0.2");
  3. System.out.println(a.add(b)); // 0.3

需注意字符串构造方式避免二进制误差。

12. 字符串处理最佳实践

  • 字符串拼接:StringBuilder(单线程)优于StringBuffer(线程安全)
  • 字符串比较:始终使用equals()而非==
  • 不可变性:字符串常量存储在字符串池中,修改会产生新对象

13. 自动类型提升陷阱
表达式运算时存在类型提升规则:

  1. short s1 = 1;
  2. s1 = s1 + 1; // 编译错误,int无法自动转short
  3. s1 += 1; // 合法,编译器隐式处理类型转换

14. 数组初始化方式对比

  1. // 静态初始化
  2. int[] arr1 = {1, 2, 3};
  3. // 动态初始化
  4. int[] arr2 = new int[3];
  5. arr2[0] = 1;
  6. // 匿名数组
  7. method(new int[]{1, 2, 3});

六、进阶知识要点

15. 程序结构组成要素

  • 包声明(package)
  • 导入语句(import)
  • 类/接口定义
  • 方法定义
  • 变量声明
  • 注释(单行/多行/文档)

16. 常用核心类库

  • 集合框架:List/Set/Map接口及其实现类
  • 并发工具:ExecutorService、CountDownLatch
  • IO流:InputStream/OutputStream、Reader/Writer
  • 网络编程:Socket、ServerSocket
  • 日志系统:Log4j、SLF4J

17. 面试常见陷阱题

  1. // 题目1:以下代码输出什么?
  2. String str1 = new StringBuilder("ja").append("va").toString();
  3. System.out.println(str1.intern() == str1); // JDK6 false, JDK7+ true
  4. // 题目2:以下代码能否编译通过?
  5. Integer a = 100, b = 100, c = 200, d = 200;
  6. System.out.println(a == b); // true
  7. System.out.println(c == d); // false

本文通过系统化的知识梳理和典型案例分析,帮助开发者建立完整的Java知识体系。建议读者结合实际项目经验,深入理解每个知识点的设计原理和应用场景,在面试中展现技术深度而非简单记忆答案。掌握这些核心概念后,可进一步研究JVM原理、并发编程等高级主题,提升技术竞争力。