java-基础
Java 基础是面试中最常考察的部分,无论是初级还是中级开发岗位,都会围绕核心概念、语法特性、底层原理等展开。以下是高频面试点整理,按模块分类说明核心考点:
一、Java 语言特性与 JVM 基础
-
Java 跨平台性
- 核心:
一次编写,到处运行的实现依赖JVM(Java 虚拟机),Java 源码编译为字节码(.class),由不同平台的 JVM 解释执行。 - 考点:JVM 与操作系统的关系、字节码的作用、JDK/JRE/JVM 的区别(JDK 包含 JRE + 开发工具,JRE 包含 JVM + 运行类库)。
- 核心:
-
面向对象三大特性
- 封装:隐藏对象内部实现,通过访问修饰符(public/private/protected/default)控制属性和方法的访问权限(如 private 属性需通过 get/set 方法操作)。
- 继承:子类继承父类非 private 的属性和方法,使用
extends关键字(Java 单继承,支持多层继承);super关键字用于访问父类构造器 / 方法 / 属性(必须在子类构造器第一行)。 - 多态:同一行为的不同表现形式,实现条件:继承 / 接口实现、方法重写、父类引用指向子类对象;分为编译时多态(重载)和运行时多态(重写,通过动态绑定实现)。
-
其他核心特性
- 抽象:通过抽象类(
abstract修饰,可含普通方法)和接口(JDK8 前全为抽象方法,JDK8 后支持默认方法default和静态方法static)实现。 - 垃圾回收(GC):JVM 自动回收无用对象内存,无需手动释放;常见 GC 算法(标记 - 清除、复制、标记 - 整理、分代收集)。
- 抽象:通过抽象类(
二、数据类型与运算符
-
数据类型分类
- 基本数据类型(8 种):
byte(1)、short(2)、int(4)、long(8)、float(4)、double(8)、char(2)、boolean(1);默认值(如 int 默认 0,boolean 默认 false)。 - 引用数据类型:类、接口、数组;默认值为
null,存储对象的内存地址。
- 基本数据类型(8 种):
-
装箱与拆箱
- 装箱:基本类型→包装类(如
int→Integer,通过valueOf());拆箱:包装类→基本类型(如Integer→int,通过intValue())。 - 考点:
Integer缓存机制(-128~127 范围的对象复用,超出范围则新建对象),例如:Integer a=127; Integer b=127; a==b→true;a=128; b=128; a==b→false。
- 装箱:基本类型→包装类(如
-
== 与 equals ()
==:基本类型比较值;引用类型比较内存地址(是否为同一对象)。equals():默认等价于==(Object 类实现),但 String、Integer 等重写后比较内容(如"abc".equals("abc")→true)。
三、字符串(String)
-
String、StringBuffer、StringBuilder 区别
- String:不可变(底层 char 数组被
final修饰),每次修改都会创建新对象,适合少量操作。 - StringBuffer:可变,线程安全(方法加
synchronized),效率低,适合多线程场景。 - StringBuilder:可变,线程不安全,效率高,适合单线程场景。
- String:不可变(底层 char 数组被
-
String 常量池
- 存储在方法区,缓存字符串字面量(如
String s="abc"直接从常量池取,new String("abc")会创建两个对象:堆中对象 + 常量池对象)。 - 考点:
intern()方法(将字符串添加到常量池,返回常量池引用),例如:String s=new String("a"); s.intern()=="a"→true。
- 存储在方法区,缓存字符串字面量(如
四、集合框架(Collections)
核心接口:
Collection(List/Set)和Map,重点考察实现类特性与底层原理。-
List 接口
- ArrayList:底层
Object[]数组,查询快(下标访问),增删慢(需扩容 / 移位);初始容量 10,扩容为 1.5 倍。 - LinkedList:底层双向链表,增删快(改指针),查询慢(需遍历);实现
Deque接口,可作为队列 / 栈使用。 - 考点:两者适用场景、扩容机制、是否线程安全(均不安全,需用
Collections.synchronizedList()包装)。
- ArrayList:底层
-
Set 接口
- HashSet:底层依赖
HashMap(存储元素作为 key,value 为固定对象),无序、不重复;判断重复依赖hashCode()和equals()(先比 hashCode,不等则不重复;相等再比 equals)。 - TreeSet:底层
TreeMap,有序(默认自然排序,或通过Comparator定制),不重复;元素需实现Comparable接口或传入比较器。
- HashSet:底层依赖
-
Map 接口
- HashMap(JDK1.8):底层
数组+链表+红黑树;数组默认容量 16(2 的幂次),负载因子 0.75,当链表长度 > 8 且数组容量 > 64 时转红黑树;线程不安全。 - HashTable:线程安全(方法加
synchronized),效率低,key/value 不能为 null;已被ConcurrentHashMap替代。 - ConcurrentHashMap(JDK1.8):线程安全,通过
CAS+synchronized(锁定链表头 / 红黑树根节点)实现,效率高于 HashTable;支持并发操作。 - TreeMap:底层红黑树,key 有序(自然排序或定制排序),可按 key 范围查询。
- HashMap(JDK1.8):底层
五、异常处理
-
异常分类
- Checked 异常:编译时必须处理(如
IOException、ClassNotFoundException),需try-catch或throws声明。 - Unchecked 异常:运行时异常(如
NullPointerException、IndexOutOfBoundsException),无需强制处理。
- Checked 异常:编译时必须处理(如
-
异常处理结构
try:执行可能出错的代码;catch:捕获并处理异常(可多个,按子类→父类顺序);finally:无论是否异常都会执行(常用于释放资源,如关闭流)。- 考点:
finally与return的执行顺序(finally中 return 会覆盖try/catch的 return)。
-
throw 与 throws
throw:在方法内手动抛出异常对象(如throw new RuntimeException())。throws:在方法声明处声明可能抛出的异常(如public void test() throws IOException)。
六、多线程
-
线程创建方式
- 继承
Thread类(重写run());实现Runnable接口(重写run(),可多线程共享资源);实现Callable接口(重写call(),有返回值,可抛异常,配合Future使用)。
- 继承
-
线程状态
- 新建(New)→就绪(Runnable)→运行(Running)→阻塞(Blocked/Waiting/Timed Waiting)→死亡(Terminated)。
- 状态切换:
start()进入就绪;sleep()/wait()进入阻塞;notify()/notifyAll()唤醒;执行完run()进入死亡。
-
线程同步
- synchronized:修饰方法(锁当前对象 / 类)、代码块(锁指定对象),保证原子性、可见性、有序性;属于悲观锁。
- volatile:保证可见性(修改后立即刷新到主存,其他线程可见)和禁止指令重排,但不保证原子性(如
i++仍可能线程不安全)。 - Lock 接口:
ReentrantLock(可重入锁),支持公平锁 / 非公平锁、可中断、超时获取锁,需手动lock()和unlock()(通常在finally中释放)。
-
线程池
- 核心参数:核心线程数、最大线程数、任务队列、拒绝策略(默认
AbortPolicy:抛异常)。 - 常见线程池:
FixedThreadPool(固定核心线程数)、CachedThreadPool(动态扩容,适合短期任务)、ScheduledThreadPool(定时任务)。
- 核心参数:核心线程数、最大线程数、任务队列、拒绝策略(默认
七、Java 8 + 新特性
- Lambda 表达式:简化匿名内部类(函数式接口专属),格式:
(参数) -> 表达式(如(a,b) -> a+b)。 - 函数式接口:仅含一个抽象方法的接口(如
Runnable、Consumer),用@FunctionalInterface注解标识。 - Stream API:对集合进行流式操作(过滤、映射、聚合等),如
list.stream().filter(s -> s.length()>3).collect(Collectors.toList())。 - Optional:解决
NullPointerException,如Optional.ofNullable(obj).orElse(defaultObj)。 - 日期时间 API:
LocalDateTime、Instant等(替代线程不安全的SimpleDateFormat)。
八、其他高频点
- static 关键字:修饰变量(类变量,共享)、方法(类方法,不能直接访问非 static 成员)、代码块(类加载时执行,优于构造器)。
- final 关键字:修饰类(不可继承)、方法(不可重写)、变量(不可修改,引用类型则地址不可变)。
- 抽象类 vs 接口:抽象类可含普通方法和构造器,单继承;接口(JDK8 后)可含默认方法,多实现;均不能实例化。
- 泛型:约束集合元素类型(如
List<String>),避免强制类型转换;通配符? extends T(上限,只能取)、? super T(下限,只能存)。

浙公网安备 33010602011771号