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号
浙公网安备 33010602011771号