java面试的一下问题
### Java面试核心知识点详解 #### 1. `Math.round()` 方法的理解及应用 - **`Math.round()` 方法**: 该方法用于对浮点数进行四舍五入处理。 - 对于正数,如果小数部分大于等于0.5,则向上取整;如果小于0.5,则向下取整。 - 对于负数,如果小数部分小于等于-0.5,则向下取整(向更小的方向);如果大于-0.5,则向上取整(向更大的方向)。 **示例**: - `Math.round(11.5)` 结果为 `12`。 - `Math.round(-11.5)` 结果为 `-11`。 #### 2. `addAll(int index, Collection<? extends E> c)` 方法解释 - **方法功能**: 向指定的列表中,在指定的位置插入另一个集合中的所有元素。 - `index`: 插入的位置。 - `Collection<? extends E> c`: 要插入的集合,其中 `E` 表示集合中的元素类型。 - `? extends E`: 表示可以接受任何 `E` 类型的子类型作为元素。 - **返回值**: 操作成功返回 `true`,失败返回 `false`。 #### 3. Char 变量存储中文字符的可能性 - **Char 变量**: 在 Java 中,`char` 类型占用 2 个字节,因此它可以存储一个中文汉字。 - **原因**: 中文汉字通常占用 2 字节(在 UTF-16 编码中),这与 `char` 的大小相匹配。 #### 4. 数组和 String 的 `length` 属性/方法 - **数组**: 没有 `length()` 方法,而是有 `length` 属性。 - 示例: `int[] arr = new int[10]; arr.length;` - **String**: 有一个 `length()` 方法来获取字符串长度。 - 示例: `String str = "Hello"; str.length();` #### 5. String 类是否可被继承 - **结论**: `String` 类是不可继承的。 - **原因**: 它被定义为 `public final class String`。 - `final`: 表示该类不能被继承。 - **注意**: 使用 `final` 关键字修饰的类、方法或变量都不能被继承或重写。 #### 6. 抽象类与接口的异同 - **相同点**: - 都不能直接实例化。 - 都可以被其他类继承或实现。 - **不同点**: - **抽象类**: - 可以包含已实现的方法和构造函数。 - 可以定义字段。 - **接口**: - 只能定义抽象方法、属性、索引器、事件的签名。 - 支持多继承。 - 用于定义一组行为规范。 - **继承关系**: - 抽象类可以实现接口,但接口不能继承抽象类。 - 抽象类可以实现接口的方法,接口则强制实现所有方法。 #### 7. 静态变量与实例变量的区别 - **静态变量**: 属于类,每个类一份,与对象无关。 - 由类加载时分配内存。 - 通过类名访问。 - **实例变量**: 属于对象,每个对象一份。 - 创建对象时分配内存。 - 通过对象访问。 #### 8. `final` 关键字的应用 - **应用**: - **修饰类**: 表示该类不能被继承。 - **修饰方法**: 表示方法不能被重写。 - **修饰变量**: 表示变量只能赋值一次且赋值后不能被修改。 #### 9. 基本数据类型与引用数据类型的存储方式 - **基本数据类型**: - 存储在栈中。 - 直接存储值。 - **引用数据类型**: - 存储在堆中。 - 存储的是对象的引用。 #### 10. `new` 运算符的过程 - **过程**: 1. **类加载**: 确保类已经加载、解析和初始化。 2. **分配内存**: 为新对象分配内存。 3. **初始化**: 调用构造方法初始化对象。 - 构造方法用于设置初始状态。 #### 11. `ArrayList` 的实现原理 - **内部结构**: `ArrayList` 实现了一个动态数组。 - 动态增长: 当添加更多元素时,如果当前容量不足,会自动增加容量。 - **扩容机制**: 默认情况下,每次扩容都会增加原有容量的 50%。 - **访问**: 元素可通过索引直接访问。 - **存储**: 内部使用数组存储元素。 这些知识点覆盖了 Java 面试中常见的几个方面,对于准备面试的候选人来说是非常有价值的复习材料。