### Java初级面试题详解
#### 1. final, finally, finalize 的区别
- **final**:在Java中是一个关键字,用于声明一个常量或者不可变的变量。一旦一个变量被声明为final,它的值就不能被改变。
- **finally**:同样是Java中的一个关键字,它用于异常处理中的一个块,确保无论是否发生异常,finally块中的代码总会被执行。
- **finalize**:是Java中一个系统级别的方法,属于Object类的一部分。当对象即将被垃圾回收器回收时,finalize方法会被调用一次,提供最后一次机会来完成清理工作。
#### 2. Anonymous Inner Class 是否可以 extends (继承),是否可以 implements (实现) interface?
- **匿名内部类**可以继承一个类或者实现一个接口。通常情况下,匿名内部类是为了实现某个接口或继承某个特定的类而定义的一个简化的类,它没有显式的名字,一般在创建的同时进行实例化。
#### 3. && 和 & 的区别
- **&** 表示按位与操作,而 **&&** 表示逻辑与操作。
- 在布尔表达式中,如果第一个操作数为 `false`,则 `&&` 不会执行第二个操作数(短路行为),而 `&` 会始终计算两个操作数。
#### 4. HashMap 与 Hashtable 的区别
- **Hashtable** 是基于 Dictionary 类的一个实现,而 **HashMap** 是 Map 接口的一个实现。
- **Hashtable** 是线程安全的,而 **HashMap** 不是。
- **HashMap** 允许使用 `null` 值和 `null` 键,而 **Hashtable** 不允许。
#### 5. Collection 与 Collections 的区别
- **Collection** 是一个接口,它是 Java 集合框架的基础接口,主要包含 List 和 Set 等集合类型。
- **Collections** 是一个工具类,提供了大量的静态方法来操作集合,例如排序、查找等。
#### 6. GC是什么?为什么需要GC?
- **GC**(Garbage Collection)即垃圾收集,是Java内存管理的重要组成部分。其主要功能是在运行时自动回收不再使用的内存资源。
- Java 提供了两种方式触发垃圾回收:`System.gc()` 和 `Runtime.getRuntime().gc()`,但这些方法并不保证一定会立即执行垃圾回收。
#### 7. Math.round(11.5) 的结果是多少?Math.round(-11.5) 的结果是多少?
- `Math.round(11.5)` 结果是 12,`Math.round(-11.5)` 结果是 -11。
- `Math.round()` 方法对浮点数进行四舍五入到最近的整数。
#### 8. short s1 = 1; s1 = s1 + 1; 的结果是什么?short s1 = 1; s1 += 1; 的结果是什么?
- `s1 = s1 + 1` 会导致编译错误,因为 `s1 + 1` 的结果是一个 int 类型,需要显式转换回 short 类型。
- `s1 += 1` 操作符会自动处理类型转换,因此该语句是合法的。
#### 9. Java 有 goto 吗?
- Java 不支持 `goto` 关键字。尽管在一些底层实现中可能会用到类似的概念,但在 Java 语言层面并没有提供 `goto`。
#### 10. 数组有 length() 吗?String 有 length() 吗?
- 数组没有 `length()` 方法,而是有一个名为 `length` 的属性来获取数组长度。
- `String` 类有一个名为 `length()` 的方法用来获取字符串长度。
#### 11. Overload 与 Override 的区别
- **Overloading** 是指在一个类中定义多个同名但参数列表不同的方法,这些方法的功能可能不同。
- **Overriding** 发生在子类覆盖父类的方法时,子类方法必须与父类方法具有相同的签名,并且返回类型相同。
- Overloaded 的方法可以有不同的返回类型,但重载的关键在于参数列表的不同;而 Overridden 的方法的返回类型必须相同,关键在于方法的签名一致。
#### 12. 一些常见的 RuntimeException
- `RuntimeException` 包括但不限于 `ClassCastException`, `IllegalArgumentException`, `NullPointerException` 等。
- 这些异常通常是因为程序逻辑错误导致的,在运行时抛出。
#### 13. Error 与 Exception 的区别
- **Error** 表示应用程序无法处理的情况,比如虚拟机错误或系统崩溃。
- **Exception** 表示一个应用程序可以处理的情况,可以通过捕获和处理异常来避免程序崩溃。
#### 14. List, Set, Map 是否是 Collection 的子类
- **List** 和 **Set** 都是 `Collection` 接口的实现类。
- **Map** 不是 `Collection` 的实现类,但它有自己的顶层接口 `Map`。
#### 15. abstract class 与 interface 的区别
- **抽象类** (`abstract class`) 可以有构造函数、成员变量、方法实现等,而接口只能有常量和抽象方法。
- 抽象类可以提供部分默认实现,而接口不能提供任何实现。
- 类可以实现多个接口,但只能继承一个抽象类。
#### 16. abstract method 是否可以同时是 static, 是否可以同时是 native, 是否可以同时是 synchronized
- 抽象方法不能是 `static`,也不能是 `native` 或 `synchronized`。抽象方法意味着方法没有具体的实现,因此不能有这些修饰符。
#### 17. 类是否可以同时实现多个接口?是否可以实现(implements)接口?是否可以同时继承具体类?
- 类可以实现多个接口。
- 类可以实现一个或多个接口。
- 类可以继承一个具体的类,并同时实现一个或多个接口。
#### 18. Constructor 是否可以被重写(override)
- 构造器不能被重写(override),但可以有多个构造器实现重载(overloading)。
#### 19. String 是否可以被继承
- `String` 类是 `final` 的,因此不能被继承。
#### 20. try {} 中有一个 return 语句,那么 try-finally {} 中的代码是否会在 return 之前执行?
- `finally` 块中的代码会在 `return` 语句之前执行。即使 `try` 块中有 `return` 语句,`finally` 块仍然会被执行。
#### 21. 2 << 2 的结果是多少?
- `2 << 2` 的结果是 8。这是将二进制数 2 左移两位的结果。
#### 22. 值相等(x.equals(y) == true)但 hash code 不相等的说法正确吗?
- 这个说法不正确。根据 Java 的规范,如果两个对象通过 `equals` 方法比较是相等的,那么它们的 `hashCode` 方法也应该返回相同的结果。
#### 23. 一个对象被另一个对象引用时,如果修改了引用的对象,那么原始对象的值会发生变化吗?
- 在 Java 中,对象引用是指向对象的引用而不是对象本身。因此,如果修改了一个对象的引用指向的新对象,原始对象不会受到影响。
#### 24. switch 是否可以使用 byte, 是否可以使用 long, 是否可以使用 String?
- `switch` 语句可以使用 `byte`, `short`, `char`, `int` 或者 `String` 作为条件判断。
- `switch` 语句不支持 `long` 类型,也不直接支持 `float` 或 `double` 类型。
#### 25. ArrayList 与 Vector 的区别
- `Vector` 是线程安全的,而 `ArrayList` 不是。
- `ArrayList` 的性能通常比 `Vector` 更好,尤其是在非同步的环境中。
- `Vector` 的默认增长因子是原容量的一倍,而 `ArrayList` 的默认增长因子是 50%。