J

Java 基础面试题

连载中

Java 基础面试题:语言特性、面向对象、异常体系、泛型、反射与常用 API。

8 篇文章 开始阅读

教程目录

1

== 和 equals 的区别是什么?

一、== 的作用 == 是 Java 的运算符,它的比较规则取决于两边的类型: 基本数据类型(byte、short、int、long、float、double、char、boolean):比较的是字面值是否相等。 引用数据类型:比较的是两个引用是否指向堆中的同一个对象(即内存地址是否相同)。 int

2

String、StringBuilder 和 StringBuffer 的区别?

一、可变性不同 String 是不可变类,内部用 final 修饰字符数组。对字符串做拼接实际上会创建新的 String 对象。 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder,内容可变,拼接时直接修改内部数组。 二、线程安全不同 St

3

为什么重写 equals 时一定要重写 hashCode?

一、先说结论 这是 Java 的通用约定:如果两个对象通过 equals 比较相等,那么它们的 hashCode 必须相同。只重写 equals 不重写 hashCode,会破坏这个约定,导致对象在 HashMap、HashSet 等集合中行为异常。 二、HashMap 的存取过程 HashMap

4

int 和 Integer 有什么区别?

一、本质区别 int 是 Java 的 8 种基本数据类型之一,直接存数值,占 4 字节,默认值 0。 Integer 是 int 的包装类,是对象,存的是指向堆中对象的引用,默认值 null。 二、自动装箱与拆箱 Integer a = 10; // 自动装箱:Integer.v

5

String 为什么是不可变的?

一、不可变的体现 String 内部用 final char[](JDK 9 后是 byte[])存储字符,且没有提供修改内部数组的方法,一旦创建内容就不能改。所谓"修改"其实是创建新对象。 二、设计原因 字符串常量池复用:相同字面量共享同一对象,节省内存。 线程安全:不可变对象天然线程安全,多线程

6

final 关键字有哪些用法?

一、修饰类 final 修饰的类不能被继承,如 String、Math。常用于工具类或不希望被扩展的类。 二、修饰方法 final 方法不能被子类重写,防止子类改变父类行为。构造方法隐式为 final。 三、修饰变量 成员变量:必须在声明时、构造方法或初始化块中赋值,赋值后不可改。 局部变量:使用前

7

重载(overload)和重写(override)的区别?

一、定义 重载:同一个类中,方法名相同,参数列表(类型/个数/顺序)不同。与返回值无关。 重写:子类重新实现父类的方法,方法签名(名称、参数、返回值)必须一致。 二、对比 维度 重载 重写 位置 同类 父子类 参数列表 必须不同 必须相同 返回值 可不同 相同或协变 权限 可不同 不能更严格 绑定时

8

接口和抽象类有什么区别?

一、核心区别 维度 抽象类 接口 关键字 abstract class interface 继承 单继承 多实现 构造方法 有 无 成员变量 任意 仅 public static final 方法实现 可有抽象/具体方法 默认方法、静态方法(JDK 8+) 设计目的 "is-a" 共性抽取 "can