一、Java 基础
1. **JDK 和 JRE 有什么区别?**
- **JDK(Java Development Kit)**是Java开发工具包,包含了开发Java应用所需的工具和库,包括编译器(javac)、JVM(Java Virtual Machine)等。
- **JRE(Java Runtime Environment)**是Java运行时环境,它包含JVM以及运行Java程序所需的基本库,但不包括开发工具。JDK包含JRE,而JRE不包含JDK。
2. **== 和 equals 的区别是什么?**
- `==` 用于比较基本数据类型的值或对象引用是否相同。对于对象,它比较的是内存地址。
- `equals()` 是 `Object` 类的方法,用于比较两个对象的内容是否相等。对于自定义对象,通常需要重写该方法来比较内容。
3. **两个对象的 hashCode() 相同,则 equals() 也一定为 true,对吗?**
- **不对**。虽然根据 `hashCode()` 值相同的两个对象可能会相等,但它们不一定是相等的对象。`equals()` 方法可以根据业务逻辑判断两个对象是否相等。
4. **final 在 Java 中有什么作用?**
- `final` 可以用于修饰类、方法和变量:
- **修饰类**:表示该类不能被继承。
- **修饰方法**:表示该方法不能被重写。
- **修饰变量**:表示该变量是常量,值不能修改。
5. **java 中的 Math.round(-1.5) 等于多少?**
- `Math.round()` 方法返回的是四舍五入后的整数值。`Math.round(-1.5)` 返回 `-1`,因为四舍五入规则会将 `-1.5` 向零舍入。
6. **String 属于基础的数据类型吗?**
- **不**,`String` 是一个对象类型,它属于 Java 的类库中的 `String` 类,不是基本数据类型。
7. **java 中操作字符串都有哪些类?它们之间有什么区别?**
- 常用的类有:
- `String`:不可变的字符序列。
- `StringBuilder` 和 `StringBuffer`:可变的字符序列,`StringBuffer` 是线程安全的,`StringBuilder` 不是。
8. **String str="i" 与 String str=new String("i") 一样吗?**
- **不一样**。`str="i"` 会从常量池中获取 `"i"` 字符串;`new String("i")` 会在堆内存中创建一个新的 `String` 对象。
9. **如何将字符串反转?**
- 可以通过 `StringBuilder` 或 `StringBuffer` 来实现:
```Java
String str = "hello";
String reversed = new StringBuilder(str).reverse().toString();
```
10. **String 类的常用方法都有哪些?**
- 常用方法包括:`length()`、`charAt()`、`substring()`、`indexOf()`、`equals()`、`toLowerCase()`、`toUpperCase()`、`replace()` 等。
11. **抽象类必须要有抽象方法吗?**
- **不**,抽象类不一定要有抽象方法。它可以有实现的方法和成员变量。
12. **普通类和抽象类有哪些区别?**
- 抽象类不能实例化,普通类可以;抽象类可以有抽象方法,普通类没有。
13. **抽象类能使用 final 修饰吗?**
- **可以**,但如果抽象类被 `final` 修饰,那么它不能被继承。
14. **接口和抽象类有什么区别?**
- 接口只能包含抽象方法,不能有方法实现(Java 8 之后可以有默认方法)。抽象类可以包含抽象方法和已实现的方法。接口用于定义行为规范,抽象类用于共享代码。
15. **java 中 IO 流分为几种?**
- Java 中的 IO 流主要分为:
- **字节流**(InputStream 和 OutputStream)
- **字符流**(Reader 和 Writer)
16. **BIO、NIO、AIO 有什么区别?**
- **BIO(阻塞 IO)**:传统的 IO 模型,每个请求都需要一个线程来处理。
- **NIO(非阻塞 IO)**:基于缓冲区和通道,支持异步操作,能通过一个线程处理多个请求。
- **AIO(异步 IO)**:操作系统级别的异步 IO,完全由操作系统进行管理,不需要线程轮询。
17. **Files 的常用方法都有哪些?**
- 常用方法有:`createFile()`、`delete()`、`exists()`、`copy()`、`move()`、`readAllLines()`、`write()` 等。
18. **String s = "a" + "b" + "c" 创建了几个对象?为什么? String s = new String("a") 创建了几个对象?**
- 第一个例子中,创建了 3 个对象:两个 `String` 对象(`"a"` 和 `"b"`)和一个新的字符串拼接结果(`"abc"`),其中 `"a"` 和 `"b"` 可能是从常量池中获取。
- 第二个例子中,创建了两个对象:一个常量池中的 `"a"` 字符串和一个 `new String("a")` 对象。
19. **String 中 equals 和 == 的区别?**
- `==` 比较的是两个对象的内存地址,是否是同一个对象。
- `equals()` 比较的是两个对象的内容是否相等。
20. **Java 的元注解有哪些?**
- Java 中的元注解有:`@Retention`、`@Target`、`@Documented`、`@Inherited`。
21. **父类和子类中静态方法、构造代码块、构造方法他们的执行顺序?**
- 执行顺序为:
1. 父类静态代码块
2. 子类静态代码块
3. 父类构造代码块
4. 父类构造方法
5. 子类构造代码块
6. 子类构造方法
22. **面向对象七大原则和三大特性?**
- **三大特性**:封装、继承、多态。
- **七大原则**:单一职责原则、开闭原则、里氏替换原则、依赖倒置原则、接口隔离原则、最少知道原则、合成聚合复用原则。
二、容器
1. **java 容器都有哪些?**
- Java 容器类分为两大类:
- **Collection**:用于存储一组数据的对象,如 `List`、`Set`、`Queue`。
- **Map**:用于存储键值对的对象,如 `HashMap`、`TreeMap`、`Hashtable`。
2. **Collection 和 Collections 有什么区别?**
- **Collection** 是一个接口,表示所有集合类的通用父类。
- **Collections** 是一个工具类,包含操作集合的静态方法,如排序、查找、同步等。
3. **List、Set、Map 之间的区别是什么?**
- **List**:有序且允许重复元素,例如 `ArrayList`、`LinkedList`。
- **Set**:无序且不允许重复元素,例如 `HashSet`、`LinkedHashSet`。
- **Map**:存储键值对,键不可重复,值可以重复,例如 `HashMap`、`TreeMap`。
4. **HashMap 和 Hashtable 有什么区别?**
- **HashMap**:线程不安全,允许一个 `null` 键和多个 `null` 值。
- **Hashtable**:线程安全,不允许 `null` 键或值。
5. **如何决定使用 HashMap 还是 TreeMap?**
- **HashMap**:如果不需要排序,使用 `HashMap`,它的查找和插入效率更高。
- **TreeMap**:如果需要按键排序,使用 `TreeMap`。
6. **说一下 HashMap 的实现原理?**
- `HashMap` 是基于哈希表(数组 + 链表/红黑树)实现的。键的 `hashCode()` 值决定了元素存储的位置,当发生哈希冲突时,采用链表或红黑树解决。
7. **说一下 HashSet 的实现原理?**
- `HashSet` 底层是使用 `HashMap` 实现的,唯一性是通过 `HashMap` 中的键来保证的。
8. **ArrayList 和 LinkedList 的区别是什么?**
- **ArrayList**:基于数组实现,支持快速随机访问,但在插入和删除元素时效率较低。
- **LinkedList**:基于链表实现,支持高效的插入和删除操作,但随机访问较慢。
9. **如何实现数组和 List 之间的转换?**
- 数组转 `List`:`Arrays.asList(array)`
- `List` 转数组:`list.toArray(new Type[0])`
10. **ArrayList 和 Vector 的区别是什么?**
- **ArrayList**:线程不安全,性能较好。
- **Vector**:线程安全,但性能较差。
11. **Array 和 ArrayList 有何区别?**
- **Array**:大小固定,可以存储基本数据类型和对象。
- **ArrayList**:大小可变,只能存储对象。
12. **在 Queue 中 poll() 和 remove() 有什么区别?**
- **poll()**:如果队列为空,返回 `null`。
- **remove()**:如果队列为空,抛出 `NoSuchElementException`。
13. **哪些集合类是线程安全的?**
- `Vector`、`Hashtable`、`CopyOnWriteArrayList`、`CopyOnWriteArraySet`、`ConcurrentHashMap`。
14. **迭代器 Iterator 是什么?**
- `Iterator` 是一个接口,用于遍历集合中的元素。
15. **Iterator 怎么使用?有什么特点?**
- 使用方法:
```java
Iterator it = collection.iterator();
while (it.hasNext()) {
Object obj = it.next();
}
```
- 特点:`Iterator` 可以避免 `ConcurrentModificationException`,且不支持修改集合内容。
16. **Iterator 和 ListIterator 有什么区别?**
- `Iterator` 只能向前遍历集合。
- `ListIterator` 支持双向遍历,可以同时修改集合。
17. **怎么确保一个集合不能被修改?**
- 可以使用 `Collections.unmodifiableList()`、`Collections.unmodifiableSet()` 等方法,返回不可修改的集合。
18. **HashSet 如何检查重复?**
- `HashSet` 使用 `hashCode()` 和 `equals()` 方法来检查元素是否重复。
19. **线程安全的 Map 有哪些?**
- `Hashtable`、`ConcurrentHashMap`、`Collections.synchronizedMap()`。
20. **HashMap 的负载因子为什么是 0.75?**
- 负载因子 0.75 是一个折衷选择,它在内存使用和性能之间取得了较好的平衡。当 `HashMap` 的大小达到容量的 75% 时,进行扩容。
三、多线程
- 并行和并发有什么区别?
- 并发:多个任务在同一时间段内交替进行,但不一定是同时执行。
- 并行:多个任务在同一时刻同