Java 基础面试题 91 道

笔记/Java/面试专栏/Java 基础面试题 91 道

整理自 Java 基础面试题 91 道,已精简冗余表述,保留考点与结论。详细原理见下方「相关学习笔记」或各题末尾链接。

相关学习笔记#

专题笔记
Java 环境与程序结构Java 环境与程序结构
变量与数据类型Java 变量与基本数据类型
运算符与类型转换Java 运算符与类型转换
流程控制Java 流程控制
数组Java 数组基础
方法Java 方法基础
类与对象Java 类与对象
封装、继承、多态Java 封装、继承与多态
抽象类与接口Java 抽象类与接口
异常处理Java 异常处理
static 关键字Java static 关键字
包与访问控制Java 包、作用域与访问控制
final/finally/finalizeJava final、finally、finalize 区别
内部类Java 内部类
Object 类Java Object 类
字符串Java 字符串
包装类型Java 包装类型
IO 基础Java IO 基础
BIO/NIO/AIO/NettyJava BIO、NIO、AIO 与 Netty

目录#


Java 概述#

1. 何为编程#

用程序设计语言编写代码,让计算机按人的意图逐步执行并解决问题。本质是人与计算机之间的指令交流。

2. 什么是 Java#

面向对象编程语言,吸收 C++ 优点,去掉多继承、指针等复杂特性;静态类型、跨平台。

3. JDK 1.5 之后三大版本#

Java SE:标准版,桌面/服务器/嵌入式应用。Java EE / Jakarta EE:企业版,Web 服务、组件模型(2018 起 EE 移交 Eclipse,称 Jakarta EE)。Java ME:微型版,移动/嵌入式设备。

4. JDK、JRE、JVM 区别#

JVM:运行字节码的虚拟机,跨平台核心。JRE = JVM + 核心类库,只运行程序。JDK = JRE + 开发工具(javacjar 等),开发必备。→ Java 环境与程序结构

5. 跨平台原理#

源码编译成 .class 字节码,由目标平台的 JVM 解释/编译执行。一次编译,多平台运行(前提是安装了对应 JVM)。

6. Java 语言特点#

简单易学、面向对象、平台无关、网络编程友好、多线程、健壮(强类型/异常/GC)、安全。

7. 什么是字节码?好处?#

.class 文件,面向 JVM 而非特定 CPU。兼顾解释型语言的可移植性和较高执行效率。

8. 主类是什么?应用 vs 小程序#

一个程序可有多个类,但只有一个主类。应用程序:含 main() 的类。Applet:继承 JApplet/Applet,无 main,由浏览器调用 init()/start()

9. 应用程序与小程序差别#

应用从 main() 启动;Applet 嵌入浏览器,由容器管理生命周期。

10. Java 与 C++ 区别#

都支持 OOP。Java:无指针直接访内存、单继承(接口可多实现)、自动 GC。C++:支持多继承。

11. Oracle JDK vs OpenJDK#

发布节奏不同(Oracle 约三年 vs OpenJDK 约三个月)。OpenJDK 开源参考实现;Oracle JDK 商业发行版,长期支持策略不同。核心代码高度重合,生产环境两者均可,注意 LTS 版本与许可协议。

基础语法 · 数据类型#

12. Java 有哪些数据类型#

基本类型byte/short/int/longfloat/doublecharboolean引用类型:类、接口、数组。→ Java 变量与基本数据类型

13. switch 能作用在 byte/long/String 上吗#

Java 5 前仅 byte/short/char/int;5 起支持枚举;7 起支持 Stringlong 始终不支持

14. 最有效率计算 2×8#

2 << 3(左移 3 位 = 乘 2³)。

15. Math.round(11.5) 和 Math.round(-11.5)#

分别为 12-11。原理:加 0.5 后向负无穷取整(floor)。

16. float f = 3.4 是否正确#

不正确。3.4 默认 double,赋给 float 需强转或加 F3.4f

17. short s1=1; s1=s1+1 有错吗?s1+=1 呢#

s1 = s1 + 1 错:s1+1 结果是 int,需强转。s1 += 1 正确:含隐式 (short) 强转。

基础语法 · 编码与注释#

18. Java 采用何种编码#

Unicode,跨平台统一字符集。

19. Java 注释分类#

单行 //、多行 /* */、文档 /** */。编译忽略,不可嵌套。

基础语法 · 访问修饰符#

20. public/private/protected/default 区别#

修饰符同类同包子类其他包
private
default
protected
public

类/外部接口不能用 private/protected。→ Java 包、作用域与访问控制

基础语法 · 运算符与关键字#

21. & 和 && 区别#

&:按位与或逻辑与(两边都求值)。&& 短路与:左边为 false 则右边不执行。→ Java 运算符与类型转换

22. Java 有没有 goto#

goto 是保留字,未使用

23. final 有什么用#

修饰不可继承、方法不可重写、变量引用不可改(引用类型内容仍可变)。→ Java 封装、继承与多态

24. final / finally / finalize 区别#

final:关键字,限制不可变。finallytry-catch 收尾块,通常必执行。finalizeObject 方法,GC 前回调,已废弃,勿用于资源释放。→ final/finally/finalize 区别 · Java 异常处理

25. this 用法#

① 指向当前对象 ② 区分成员与参数同名 ③ 调用本类其他构造 this(...)。→ Java 类与对象

26. super 用法#

① 访问父类成员 ② 区分子类与父类同名成员 ③ 调用父类构造 super(...)

27. this 与 super 区别#

都必须在构造器第一行;不能同时出现;均不能在 static 环境使用。this 指向本对象,super 访问父类。

28. static 主要意义#

类级别成员/方法,无需实例即可访问;静态块类加载时执行一次,可用于初始化。

29. static 特点#

全实例共享一份;类加载时分配;可通过类名直接访问。

30. static 应用场景#

共享常量、工具方法、静态代码块、静态内部类、静态导包。

31. static 注意事项#

静态只能直接访问静态;非静态可访问静态和非静态。→ Java static 关键字

流程控制#

32. break / continue / return 区别#

break:跳出当前循环。continue:跳过本次循环。return:结束当前方法。→ Java 流程控制

33. 如何跳出多重嵌套循环#

在外层循环前加标号,内层 break 标号;

面向对象 · 概述与三大特性#

34. 面向对象 vs 面向过程#

过程:步骤化,性能高,维护扩展弱。对象:模型化,封装/继承/多态,易维护扩展,抽象层次更高。

35. 面向对象特征#

封装:隐藏细节,暴露接口。继承:复用父类。多态:同一引用调用不同实现。抽象:提取共性。→ Java 封装、继承与多态

36. 多态机制与实现#

编译看左边引用类型,运行看右边实际对象(动态绑定)。条件:继承 + 重写 + 向上转型

37. 面向对象五大原则(了解)#

SRP 单一职责、OCP 开闭、LSP 里氏替换、DIP 依赖倒置、ISP 接口隔离。

面向对象 · 类与接口#

38. 抽象类 vs 接口#

都不能实例化。抽象类:is-a,可有构造器/任意修饰符/单继承。接口:can-do,默认 public 方法,多实现,字段默认 public static final。优先接口定义行为,抽象类提供公共实现。→ Java 抽象类与接口

39. 普通类 vs 抽象类#

普通类无抽象方法、可实例化;抽象类可有抽象方法、不可实例化。

40. 抽象类能用 final 修饰吗#

不能,矛盾:抽象类需被继承,final 禁止继承。

41. new 关键字与引用区别#

new创建对象;引用在栈中存地址。一引用可指 0/1 个对象;一对象可被多引用指向。→ Java 类与对象

变量与方法#

42. 成员变量 vs 局部变量#

成员变量局部变量
位置类中方法外方法/块内
存储堆(随对象)
默认值无,需赋值
作用域整个类块/方法内

43. 无参构造方法的作用#

子类构造若未显式 super(...),需父类有无参构造供默认调用,否则编译错误。

44. 为何先调父类无参构造#

完成父类部分初始化,再初始化子类。

45. 构造方法作用?没声明能运行吗#

初始化对象。未声明时编译器提供默认无参构造

46. 构造方法特性#

名与类同;无返回值类型;创建对象时自动调用;可重载不可重写。→ Java 方法基础

47. 静态变量 vs 实例变量#

静态变量类加载时分配一份;实例变量每对象一份。

48. 静态变量 vs 普通变量#

静态变量全实例共享,类加载初始化;实例变量各对象独立。

49. 静态方法 vs 实例方法#

静态:类名.方法() 或对象调用,只能访问静态成员。实例:需对象,可访问所有成员。

50. 静态方法内为何不能调非静态成员#

静态属类级别,不依赖实例;非静态成员需先有对象。

51. 方法返回值作用#

把方法执行结果返回给调用方,供后续使用。

内部类#

52. 什么是内部类#

定义在另一个类内部的类,是类的成员之一。→ Java 内部类

53. 内部类分类#

静态内部类成员内部类局部内部类匿名内部类。→ Java 内部类

54. 内部类优点#

访问外部类私有成员;更好的封装;实现多重继承效果;方便回调。

55. 内部类应用场景#

多算法、非 OOP 语句块封装、代码扩展、仅供外部类使用的辅助类。

56. 局部/匿名内部类访问局部变量为何要 final#

局部变量在栈上随方法结束销毁,内部类可能仍持有引用;final 保证拷贝值不变,避免生命周期不一致。

57. 内部类程序题(变量遮蔽)#

同名时:局部变量 > this.成员 > Outer.this.成员。例:局部 14,内部类 13,外部类 12。→ Java 内部类

重写与重载#

58. 构造器能否被重写#

不能重写(不继承),但可重载

59. 重载 vs 重写#

重载:同类,方法名同、参数列表不同,与返回值无关。重写:父子类,签名相同,访问权限不能更严,返回值协变。→ Java 封装、继承与多态

对象相等#

60. == 与 equals 区别#

==:基本类型比值,引用类型比地址。equals:默认同 ==;重写后比内容。String 已重写 equals。

61. hashCode 与 equals#

相等对象 hashCode 必同;hashCode 同不一定 equals。重写 equals 必须重写 hashCode(HashMap/HashSet 依赖)。→ Java Object 类

62. 对象相等 vs 引用相等#

对象相等比内容;引用相等比地址

值传递#

63. 传参后能改对象属性,是值还是引用传递#

值传递。传递的是引用的拷贝,可通过拷贝修改对象状态,但不能让调用者的引用指向新对象。

64. 为什么 Java 只有值传递#

方法参数是值的拷贝。改基本类型不影响实参;改对象字段会影响(同一对象);交换引用变量不影响调用方。

65. 值传递 vs 引用传递(概念)#

值传递:拷贝值,互不影响。引用传递:传地址本身。Java 始终是值传递(引用也是拷贝)。

Java 包#

66. JDK 常用包#

java.lang(基础)、java.util(集合)、java.io/java.nio(IO)、java.net(网络)、java.sql(数据库)。

67. java 与 javax 区别#

历史命名差异,现均为标准 API 一部分,无实质区别。

IO 流#

68. IO 流分几种#

按流向:输入/输出。按单元:字节/字符。按角色:节点流/处理流。基类:InputStream/OutputStreamReader/Writer。→ Java IO 基础

69. BIO / NIO / AIO 区别#

BIO:同步阻塞,一连接一线程。NIO:同步非阻塞,Channel + Buffer + Selector 多路复用。AIO:异步非阻塞(NIO.2),基于回调。→ Java BIO、NIO、AIO 与 Netty

70. Files 常用方法#

existscreateFilecreateDirectorydeletecopymovesizereadStringwriteStringnewBufferedReader 等。→ Java IO 基础

反射#

71. 什么是反射#

运行时获取类信息并动态创建对象、调用方法的能力。

72. 反射优缺点#

优点:灵活、框架基础。缺点:性能较低、破坏封装。

73. 反射应用场景#

Spring/Hibernate 等框架、JDBC Class.forName、动态代理、配置驱动实例化。

74. 获取 Class 三种方式#

对象.getClass()Class.forName(全限定名)类名.class

String#

75. 字符常量 vs 字符串常量#

字符 'a' 单字符;字符串 "a" 地址引用。字符占 2 字节(UTF-16),字符串占多个字节+结束符。

76. 字符串常量池#

堆中专门存字符串字面量,相同字面量共享引用,节省内存。

77. String 是基本数据类型吗#

不是,是引用类型。基本类型 8 种 + 枚举。文本用 String 封装 char 数组。

78. String 特性#

不可变、常量池缓存、final 类。→ Java 字符串

79. String 为何不可变#

内部 private final char[] value(JDK 9+ 为 byte[]),无修改方法。

80. String 真的不可变吗#

对象内容不可变,但引用可变str = str + " World" 指向新对象)。反射可改底层数组,但不应这样做。

81. 能否继承 String#

不能final 类。

82. String str=“i” vs new String(“i”)#

前者常量池;后者堆上新对象。

83. new String(“xyz”) 几个对象#

两个:常量池 "xyz" + 堆上 String 对象。

84. 字符串反转#

StringBuilder/StringBufferreverse()

85. 数组有 length() 吗?String 呢#

数组 length 属性;String length() 方法。→ Java 数组基础 · Java 字符串

86. String 常用方法#

indexOfcharAtreplacetrimsplitgetByteslengthtoLowerCase/UpperCasesubstringequals

87. HashMap 用 String 做 key 好处#

String 不可变,hashCode 可缓存,减少重复计算。

88. String / StringBuffer / StringBuilder#

String 不可变,每次改生成新对象。StringBuffer 可变+同步,线程安全。StringBuilder 可变无同步,单线程更快。→ Java 字符串

包装类#

89. 自动装箱与拆箱#

基本类型 ↔ 包装类型的自动转换(Java 5+)。

90. int 与 Integer 区别#

int 基本类型;Integer 包装类,可为 null,提供工具方法。

91. Integer a=127 与 b=127 相等吗#

-128~127 缓存范围内 == 为 true(同一对象);超出为 false。new Integer() 始终 false。→ Java 包装类型


附:1 年经验岗 — 图中考点在本站的对应笔记#

以下内容在仓库里已有,按图中「必准备 / 选准备 / 可弱化」对照查阅(非单独重写文章)。

必准备(约 70%)#

图中考点本站笔记
集合 ArrayList/LinkedList、HashMap 扩容Java 集合 · 集合面试 52 道
多线程:创建方式、线程池参数、synchronized/volatile线程基础 · 线程池 · volatile 与 JMM · 多线程 59 道
异常:受检/非受检、业务统一处理异常处理(含 @RestControllerAdvice
Spring:@Autowired、三层、@Transactional 同类失效IoC · MVC 三层 · 事务
MyBatis:#{} ${}、动态 SQL、Mapper/XMLMyBatis 概述 · MyBatis 面试 37 道
MySQL:索引、EXPLAIN 优化、隔离级别与脏读MySQL 基础 · MySQL 面试 40 道
Redis:五类型、过期、穿透/击穿/雪崩Redis 基础 · Redis 面试 15 道
项目经验(主项目 10 分钟)准备:模块、2~3 个接口、表设计、Redis 用法、1 个慢 SQL 或 Bug 案例(话术可写在个人笔记里)

选准备(约 20%)#

图中考点本站笔记
Spring Boot 自动配置、Starter自动配置与 Starter
Nginx 反向代理、静态资源Spring Cloud 基础(Nginx 小节)
微服务:注册中心、网关、Feign同上 · Spring Cloud 面试 49 道

可弱化(约 10%)#

图中考点建议
JVM 调优、G1、Full GC知道 JDK/JRE/JVM 即可 → 环境与程序结构
分布式 Seata、CAP 长篇听过即可,见 Spring Cloud 面试
算法反转链表、两数之和;单例 → 创建型模式;生产者消费者 → 阻塞队列
文章目录

文章目录