本书汇集了32道精选Java面试难题,旨在帮助读者深入理解Java核心技术,提高编程技能,顺利通过技术面试。
### JAVA变态面试32问知识点解析
#### 1. final, finally, finalize
- **final**: 在Java中,`final`关键字有多个用途。当它用于变量时,表示该变量的值一旦被初始化就不能更改(对于引用类型的变量,指的是引用不能指向另一个对象,但对象中的数据可以更改)。当用于类时,表示该类不能被继承;用于方法时,则表示该方法不能被重写。
- **finally**: `finally`块通常与`try`和`catch`一起使用,用来确保无论是否发生异常,某些代码都能得到执行。即使`try`或`catch`块中有`return`语句,`finally`块中的代码也会被执行。
- **finalize**: `finalize()`方法是Java中Object类的一个方法,用于在对象被垃圾回收前执行一些清理工作。开发者可以通过覆盖这个方法来释放系统资源,但不建议依赖于它的执行,因为其执行时间和确定性不可靠。
#### 2. 匿名内部类
- 匿名内部类是一种特殊的内部类,没有名称,通常用于实现接口或扩展一个类,并立即创建一个实例。例如:
```java
new Thread(new Runnable() {
public void run() {
实现run方法
}
}).start();
```
#### 3. 静态嵌套类 vs 内部类
- Java中的内部类分为静态内部类(也称为嵌套类)和非静态内部类。静态内部类不依赖于外部类的实例,可以独立存在。而非静态内部类则需要一个外部类实例才能创建。
- 静态内部类与外部类之间的关系类似于两个完全独立的类之间的关系,它们之间可以互相访问私有成员。而非静态内部类可以访问外部类的所有成员,包括私有的。
#### 4. HashMap vs Hashtable
- `HashMap`允许键和值为`null`,而`Hashtable`不允许任何键或值为`null`。
- `Hashtable`是线程安全的,而`HashMap`不是。如果需要线程安全,可以选择使用`ConcurrentHashMap`.
#### 5. Collection vs Collections
- `Collection`是Java集合框架中的根接口,所有具体的集合类都实现了这个接口,如`List`, `Set`.
- `Collections`是一个工具类,提供了许多静态方法用于操作集合类,例如排序、查找等。
#### 6. 断言 (assert)
- 断言是程序中的一种检查机制,在开发阶段用来验证假设条件是否成立。默认情况下断言是关闭的,可以通过命令行参数开启:
- `-ea`: 全局启用断言。
- `-da`: 全球禁用断言。
- `-esa`: 系统级启用断言。
- `-dsa`: 系统级禁用断言.
- 断言的基本语法如下:
```java
assert expression1;
assert expression1 : expression2;
```
- 断言主要用于调试目的,生产环境中通常不开启。
#### 7. 垃圾回收 (Garbage Collection)
- Java中的垃圾收集(GC)自动管理内存的释放。虽然可以通过`System.gc()`或`Runtime.getRuntime().gc()`显式调用垃圾回收器,但这并不是一个好的实践,因为具体的执行和效率由JVM决定。
#### 8. String 对象
- `String`类在Java中是不可变的,这意味着一旦创建了一个字符串对象其值就不能被改变。这种特性使得它非常适合用于并发环境。
- 使用`new String(xyz)`会创建一个新的字符串对象,但如果有相同的xyz存在于字符串池中,则不会再次创建。
#### 9. Math.round 方法
- `Math.round(11.5)`返回12,因为四舍五入处理小数部分。同样地, `Math.round(-11.5)` 返回 -11.
#### 10. short 类型赋值
- 当执行`short s1 = 1; s1 = s1 + 1;`时会导致编译错误,因为`s1 + 1`的结果类型默认是int, 需要显式转换回short.
- `short s1 = 1; s1 += 1;`则可以直接通过编译,+=操作符会自动处理类型转换.
#### 11. sleep() vs wait()
- `sleep()`方法使当前线程暂停指定的时间,期间不会释放锁。
- 调用`wait()`需要先获得对象的锁, 在调用后该线程将释放锁并等待直到被其他线程唤醒。
#### 12. Java 中的 goto
- Java语言中并没有提供goto关键字,因为这被认为是不良编程习惯可能导致代码难以理解和维护.
#### 13. length 属性
- 在Java中字符串类`String`使用