### Java面试基础知识详解
#### 一、final, finally, finalize的区别
- **final**: 这个关键字用于声明常量或不可变对象。当一个变量被声明为final时,它的值在初始化之后就不能再更改。对于类来说,如果一个类被声明为final,则该类不能被继承。对于方法来说,如果一个方法被声明为final,则该方法不能在子类中被重写。
- **finally**: finally块总是会被执行,无论try-catch块中是否抛出了异常。通常用来释放资源,如关闭文件流或数据库连接。即使try-catch块中包含了return语句,finally块中的代码也会被执行。
- **finalize**: 这是一个方法,是`Object`类的一个protected方法,用于垃圾回收机制。当对象即将被垃圾回收器回收之前,finalize方法会被调用。但不推荐使用此方法来处理资源释放等工作,因为它的执行不确定且可能会导致性能问题。
#### 二、匿名内部类
- **匿名内部类**可以继承其他类或实现接口。匿名内部类没有名称,通常用于立即创建并使用一个对象,而不必为其定义一个单独的类。它可以实现接口或继承一个类,但不能同时实现多个接口或继承多个类。
#### 三、Static Nested Class和Inner Class的区别
- **Static Nested Class**: 静态嵌套类是一种内部类,但它不需要依赖于外部类的实例就能存在。静态嵌套类可以通过外部类的类名直接访问,不需要创建外部类的实例。
- **Inner Class**: 普通内部类是定义在一个外部类内部的类,它可以直接访问外部类的所有成员,包括私有成员。普通内部类的实例依赖于外部类的实例,也就是说,要创建普通内部类的实例,首先需要有一个外部类的实例。
#### 四、& 和 && 的区别
- **&**: 这是一个位运算符,也可以用于逻辑操作,但它总是会评估两边的操作数。
- **&&**: 这是一个短路逻辑运算符,只有当左边的操作数为true时,右边的操作数才会被评估。这有助于提高效率。
#### 五、HashMap和Hashtable的区别
- **HashMap**: 允许使用null键和null值,线程不安全,效率更高。
- **Hashtable**: 不允许使用null键和null值,线程安全,效率相对较低。
#### 六、Collection和Collections的区别
- **Collection**: 是一个接口,它是所有集合类的根接口,如List、Set等都实现了这个接口。
- **Collections**: 是一个工具类,提供了各种静态方法来操作集合,例如排序、查找等。
#### 七、何时使用assert
- `assert`关键字用于添加断言到程序中,主要用于调试目的。当assert后面跟的条件为false时,会抛出AssertionError。通常在开发阶段使用,部署时通常会关闭assert语句以提高性能。
#### 八、GC是什么?为什么要有GC?
- **GC (Garbage Collection)**: 垃圾回收机制,自动管理内存的过程。它负责回收不再使用的对象占用的内存,防止内存泄漏,简化编程。
- **原因**: 在Java中,手动管理内存容易出现内存泄漏或内存溢出等问题,GC可以自动处理这些问题,提高程序的健壮性和可靠性。
#### 九、Strings=new String("xyz");创建了几个String Object?
- 创建了两个`String Object`。一个是在字符串常量池中,另一个是通过`new String`创建的新对象。
#### 十、Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
- `Math.round(11.5)`等于`12`。
- `Math.round(-11.5)`等于`-11`。`Math.round()`方法将小数四舍五入到最近的整数,如果是正好位于两个整数中间,则向上取整。
#### 十一、short s1=1; s1=s1+1;有什么错? short s1=1; s1+=1;有什么错?
- `short s1=1; s1=s1+1;`: 这里会报错,因为在进行加法运算时,由于`short`类型会被提升为`int`类型,所以`s1+1`的结果是一个`int`类型。尝试将`int`类型赋值给`short`类型会导致编译错误。
- `short s1=1; s1+=1;`: 这样不会报错,因为`+=`操作符会自动处理类型转换,先进行加法运算,然后自动转换回`short`类型。
#### 十二、sleep()和wait()的区别
- **sleep()**: 属于Thread类的方法,使当前正在执行的线程暂停指定的时间,释放CPU但不释放锁。
- **wait()**: 属于Object类的方法,使当前线程等待直到被唤醒或其他线程调用notify或notifyAll,释放对象锁。
#### 十三、Java有没有goto?
- Java中没有传统的`goto`语句,但有类似的标签化跳转语句`break`和`continue`可以实现类似功能。
### JAVA相关基础知识详解
#### 面向对象的特征
- **抽象**: 抽象是面向对象编程的基本思想之一,它关注的是事物的本质特征,而不是细节。
- **继承**: 继承使得类之间的关系更加清晰,提高了代码的复用性和可扩展性。
- **封装**: 封装是隐藏对象的具体实现细节,只暴露必要的接口供外部使用,增强了代码的安全性和稳定性。
- **多态性**: 多态性使得同一个接口可以有不同的实现方式,提高了程序的灵活性和可扩展性。
#### String是最基本的数据类型吗?
- `String`不是基本数据类型,而是引用类型。基本数据类型包括`byte`、`int`、`char`等。
#### int和Integer有什么区别
- `int`是基本数据类型,而`Integer`是`int`的包装类,可以用于对象引用、空值处理等场景。
#### String和StringBuffer的区别
- `String`是不可变的字符串,一旦创建后不能更改其内容。
- `StringBuffer`是可变的字符串,可以在原基础上进行修改,适用于频繁修改字符串内容的场景。
#### 运行时异常与一般异常的异同
- **运行时异常**: 通常是由程序逻辑错误引起的异常,比如数组越界、空指针异常等。
- **一般异常**: 需要程序显式捕获或声明抛出的异常,比如输入输出异常。
#### Servlet的生命周期
- **初始化**: Servlet实例化后,容器调用其`init`方法。
- **服务**: 当客户端请求到达时,容器调用其`service`方法。
- **销毁**: 当Servlet不再需要时,容器调用其`destroy`方法。
以上是Java面试中常见的基础知识和核心概念,理解并掌握这些知识点对于通过面试至关重要。