【Java核心技术/基础】25道Java核心技术基础面试题及答案
以下是从基础层面出发整理的25道Java核心技术面试题及答案。这些问题覆盖了Java的核心概念,包括基本语法、面向对象、集合框架、多线程、JVM基础等,旨在帮助您系统复习面试核心知识点。答案基于Java标准规范和实践经验整理,确保真实可靠。每个问题下方提供简明答案,并自然地引用相关知识点(如JVM内存模型、类加载过程等)。
25道Java核心技术基础面试题及答案
-
Java的基本数据类型有哪些?
答:Java有8种基本数据类型:byte
(8位)、short
(16位)、int
(32位)、long
(64位)、float
(32位)、double
(64位)、char
(16位 Unicode)、boolean
(true/false)。这些类型直接存储在栈内存中,效率高。 -
区分JDK、JRE和JVM的作用?
答:JDK(Java Development Kit)是开发工具包,包含编译器(javac)和调试工具;JRE(Java Runtime Environment)是运行环境,包含JVM和核心类库;JVM(Java Virtual Machine)是虚拟机,执行字节码。开发需JDK,运行需JRE。 -
解释面向对象编程(OOP)的四大特性?
答:封装(隐藏对象细节,通过访问修饰符控制)、继承(子类复用父类属性和方法)、多态(同一接口不同实现,通过重写或重载)、抽象(定义共性,如抽象类和接口)。例如,Animal
抽象类可被Dog
子类继承。 -
final关键字的作用?
答:修饰类时表示不可继承(如String
);修饰方法时不可重写;修饰变量时为常量,值不可变(基本类型)或引用不可变(对象类型)。 -
static关键字的作用?
答:修饰变量时为类变量,所有实例共享;修饰方法时为类方法,可通过类名直接调用;修饰代码块在类加载时执行;修饰内部类时可直接实例化。 -
抽象类和接口的区别?
答:抽象类可包含实现方法(非抽象方法)和字段,单继承;接口只定义抽象方法(Java 8后支持默认方法),多实现。接口强调行为契约,抽象类侧重代码复用。 -
Java异常处理机制中,try-catch-finally的执行顺序?
答:先执行try
块,若异常跳转catch
块处理,最后执行finally
块(无论是否异常)。例如,文件操作中finally
常用于关闭资源。 -
checked异常和unchecked异常的区别?
答:checked异常(如IOException
)需在编译时处理(捕获或声明抛出);unchecked异常(如NullPointerException
)是运行时异常,可不处理。 -
解释Java集合框架的主要接口?
答:核心接口包括:Collection
(根接口)、List
(有序可重复,如ArrayList
)、Set
(无序唯一,如HashSet
)、Map
(键值对,如HashMap
)、Queue
(队列)。 -
ArrayList和LinkedList的区别?
答:ArrayList
基于动态数组,随机访问快(O(1)O(1)O(1)),但插入删除慢(O(n)O(n)O(n));LinkedList
基于双向链表,插入删除快(O(1)O(1)O(1)),但随机访问慢(O(n)O(n)O(n))。 -
HashMap的工作原理?
答:基于哈希表,通过hashCode()
计算桶位置;冲突时使用链表或红黑树(Java 8优化)。负载因子(默认0.75)触发扩容,性能接近O(1)O(1)O(1)。 -
如何创建线程?推荐哪种方式?
答:方式一:继承Thread
类并重写run()
;方式二:实现Runnable
接口;推荐Runnable
,避免单继承限制,且支持线程池复用资源。 -
synchronized关键字的作用?
答:修饰方法或代码块,实现线程同步,确保同一时间只有一个线程访问临界资源。基于监视器锁(monitor),解决竞态条件。 -
volatile关键字的作用?
答:保证变量可见性(线程直接读写主内存)和禁止指令重排序,但不保证原子性。适用于状态标志变量,如volatile boolean flag
。 -
简述JVM内存结构?
答:包括线程私有的程序计数器、Java虚拟机栈、本地方法栈;线程共享的堆(对象实例)、方法区(存储类信息、常量、静态变量等)。Java 8后方法区改为元空间,使用本地内存。 -
垃圾回收(GC)机制的基本原理?
答:GC自动回收堆中不再引用的对象。算法包括标记-清除、复制、标记-整理。分代收集策略:新生代(Minor GC)、老年代(Major GC)。 -
String, StringBuilder, StringBuffer的区别?
答:String
不可变,线程安全但拼接效率低;StringBuilder
可变,非线程安全,效率高;StringBuffer
可变,线程安全(synchronized修饰),效率较低。 -
反射是什么?应用场景?
答:反射允许运行时获取类信息并操作对象(如Class.forName()
)。用于框架开发(如Spring依赖注入)、动态代理。但降低性能,需谨慎使用。 -
泛型的作用和类型擦除机制?
答:泛型提供编译时类型安全,防止ClassCastException
。Java通过类型擦除实现,运行时泛型信息被擦除(如List<String>
变为List
),兼容旧代码。 -
注解(Annotation)的作用?
答:为代码添加元数据,用于编译检查(如@Override
)、运行时处理(如Spring的@Autowired
)。自定义注解需通过@interface
定义。 -
内部类的类型及优缺点?
答:包括成员内部类、静态嵌套类、局部内部类、匿名内部类。优点:封装相关逻辑,访问外部类私有成员。缺点:增加复杂性。匿名内部类无名字,必须实现接口或继承抽象类,不能定义静态成员。 -
类加载过程简述?
答:加载(Loading):读取字节码生成Class
对象;验证(Verification):检查格式;准备(Preparation):分配内存;解析(Resolution):符号引用转直接引用;初始化(Initialization):执行静态代码块。加载可从文件、动态代理等多源获取。 -
方法区存储的内容?
答:存储已被加载的类信息、常量(如字符串常量池)、静态变量、即时编译器编译后的代码。Java 8后由永久代改为元空间,避免内存溢出。 -
什么是函数式接口?举例说明。
答:只含一个抽象方法的接口(如Runnable
)。Java 8支持Lambda表达式简化实现,例如() -> System.out.println("Hello")
。 -
Java中的序列化与反序列化?
答:序列化将对象转为字节流(实现Serializable
接口),用于网络传输或存储;反序列化重建对象。需注意serialVersionUID
保证兼容性。