Java基础篇
1. Java基础类型和自动装箱/拆箱
在Java中,基本数据类型包括byte、short、int、long、float、double、char和boolean。而封装类型则对应为Byte、Short、Integer、Long、Float、Double、Character和Boolean。
自动装箱/拆箱是Java 5及以后版本中引入的特性,允许基本数据类型和封装类型之间自动转换。以下是一个简单的例子:
Integer i = 10; // 自动装箱
int j = i; // 自动拆箱
2. Java内存模型
Java内存模型主要定义了线程和内存之间的交互,包括可见性、原子性和有序性。其中,volatile关键字可以保证变量的可见性,synchronized关键字可以保证原子性和有序性。
以下是一个使用volatile的例子:
public class VolatileExample {
public volatile boolean flag = false;
public void runInThread() {
while (!flag) {
// 执行任务
}
}
public void changeFlag() {
flag = true;
}
}
3. String、StringBuilder和StringBuffer的区别
String是不可变的,每次对String进行修改时都会生成一个新的对象。而StringBuilder和StringBuffer是可变的,适用于频繁进行字符串拼接的场景。
以下是三个类的简单示例:
String str = "Hello";
str += " World"; // 创建新的对象
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 不创建新的对象
StringBuffer sbf = new StringBuffer("Hello");
sbf.append(" World"); // 不创建新的对象
Java集合框架篇
1. List、Set和Map的区别
List是有序的集合,元素可以重复;Set是无序的集合,元素不能重复;Map是键值对的集合,每个键只能对应一个值。
以下是三个集合的简单示例:
List<String> list = new ArrayList<>();
Set<String> set = new HashSet<>();
Map<String, String> map = new HashMap<>();
2. HashMap和HashSet的工作原理
HashMap基于哈希表实现,通过键的哈希值来存储和查找键值对。HashSet基于HashMap实现,利用HashMap的键存储元素,并确保元素的唯一性。
以下是两个集合的简单示例:
HashMap<String, Integer> map = new HashMap<>();
HashSet<String> set = new HashSet<>();
Java多线程篇
1. 线程状态
Java线程共有6种状态,分别为:新建(NEW)、就绪(RUNNABLE)、运行(RUNNING)、阻塞(BLOCKED)、等待(WAITING)和终止(TERMINATED)。
以下是线程状态的简单示例:
Thread t = new Thread();
t.getState(); // 返回线程的状态
2. 线程同步
线程同步是防止多个线程同时访问共享资源而引起数据不一致的问题。Java提供了多种同步机制,包括synchronized关键字、ReentrantLock等。
以下是使用synchronized的简单示例:
public class SynchronizedExample {
public synchronized void method() {
// 同步代码块
}
}
Java反射篇
1. 反射的概念
反射是Java在运行时动态获取信息并调用对象的方法。通过反射,可以获取类的字段、方法、构造器等信息。
以下是获取类信息的简单示例:
Class<?> clazz = MyClass.class;
Field[] fields = clazz.getDeclaredFields(); // 获取类字段
Method[] methods = clazz.getDeclaredMethods(); // 获取类方法
2. 反射的使用场景
反射常用于框架开发和插件扩展。例如,Spring框架使用反射创建对象,Hibernate框架使用反射操作数据库。
总结
本文介绍了Java面试中常见的核心问题,包括Java基础、集合框架、多线程和反射。掌握这些知识,将有助于你在Java面试中取得好成绩。祝你好运!
