### Java基础系列面试题解析 #### 1. JDK与JRE的区别 - **JDK (Java Development Kit)**:这是Java开发工具包,包含了Java运行环境(JRE)以及Java虚拟机(JVM)等必要的开发工具。它是Java开发者进行编程时所必需的软件开发包(SDK)。 - **JRE (Java Runtime Environment)**:这是Java运行环境,它包含了运行Java程序所需的所有组件,如Java虚拟机(JVM)、Java核心类库等。只要安装了JRE,用户就可以运行Java程序。 #### 2. `==`与`equals()`的区别 - **`==`**:用于比较两个变量或实例是否指向相同的内存地址。如果两个变量或实例指向同一对象,则`==`返回`true`。 - **`equals()`**:用于比较两个变量或实例指向的对象内容是否相同。通常用于比较对象的逻辑等价性。默认情况下,`equals()`方法的行为与`==`类似,即比较对象的引用;但在许多类中(如`String`类),`equals()`方法已经被重写以实现基于对象内容的比较。 #### 3. `hashCode()`与`equals()`的关系 - 如果两个对象的`equals()`方法返回`true`,则这两个对象的`hashCode()`值一定相同。 - 反之,如果两个对象的`hashCode()`值相同,这并不能保证它们的`equals()`方法也返回`true`。这是因为`hashCode()`的碰撞问题(即不同的对象可能具有相同的`hashCode()`值)是不可避免的。 #### 4. 散列存储(Hash存储) - 散列存储是一种查找技术,其目的是通过一种确定的方式将数据元素的关键码映射到存储位置上,从而实现高效的数据访问。 - 在散列存储中,每个对象都有一个唯一的物理地址,这个地址经过散列函数计算后生成一个散列码(`hashCode`),这个散列码决定了对象在散列表中的存储位置。 #### 5. 为什么两个不同对象的`hashCode()`会相同? - 每个对象的物理地址被转换成一个整数,通过散列函数计算得到`hashCode`。由于散列函数的设计局限性,可能会出现不同的对象拥有相同的`hashCode`值的情况,这种现象称为散列碰撞。 - 散列碰撞是不可避免的,尤其是在大型数据集或大量对象的情况下,因此设计良好的散列函数对于减少碰撞的概率非常重要。 #### 6. `final`关键字的作用 - **变量**:当`final`修饰变量时,变量只能被赋值一次。如果是基本类型,不能修改其值;如果是引用类型,不能改变引用,但可以修改对象的属性值。 - **方法**:当`final`修饰方法时,该方法不能被子类重写。 - **类**:当`final`修饰类时,该类不能被继承。 #### 7. `Math.round(-1.5)`的结果 - `Math.round(-1.5)`的结果是`-1`。`Math.round()`方法首先将参数增加0.5,然后向下取整。因此,对于`-1.5`,增加0.5变为`-1.0`,然后向下取整得到`-1`。 #### 8. `String`是否属于基础数据类型 - `String`不属于基础数据类型。Java的基础数据类型包括`byte`、`int`、`float`、`double`、`boolean`、`long`、`char`、`short`等。`String`是引用类型,表示字符序列。 #### 9. 字符串类的区别 - **`String`**:不可变字符串,适用于字符串不会被改变的场景。 - **`StringBuilder`**:线程不安全,但性能更高,适用于单线程环境中频繁修改字符串的场景。 - **`StringBuffer`**:线程安全,性能较低,适用于多线程环境中频繁修改字符串的场景。 #### 10. `String str = "i"`与`String str = new String("i")` - `String str = "i"`:`i`值存储在常量池中,`str`变量引用的是常量池中的`i`。 - `String str = new String("i")`:在堆内存中创建了一个新的`String`对象,`str`变量引用的是堆内存中的新对象。 #### 11. 字符串反转 - 使用`StringBuilder`或`StringBuffer`的方法`reverse()`来反转字符串。 #### 12. `String`类的常用方法 - `length()`:获取字符串长度。 - `getBytes()`:获取字符串的字节数组表示。 - `toCharArray()`:将字符串转换为字符数组。 - `split(String regex)`:根据正则表达式分割字符串。 - `equals(Object obj)`:比较字符串与另一个对象的内容是否相同。 - `contains(CharSequence s)`:检查字符串是否包含指定的字符序列。 - `startsWith(String prefix)`:检查字符串是否以指定的前缀开始。 - `endsWith(String suffix)`:检查字符串是否以指定的后缀结束。 - `indexOf(String str)`:返回指定子字符串首次出现的位置。 - `charAt(int index)`:返回指定索引处的字符。 #### 13. 抽象类的相关概念 - **抽象类**不一定要有抽象方法,但如果有抽象方法,该类必须声明为抽象类。 - **抽象类**不能直接创建对象,必须被继承并实现所有的抽象方法。 - **抽象类**可以包含构造方法、非抽象方法和其他成员。 #### 14. 抽象类与接口的区别 - **接口**:提供了一种完全抽象的类型,只能包含抽象方法声明、静态常量、默认方法等。接口支持多重继承,一个类可以实现多个接口。 - **抽象类**:提供了部分实现,可以包含抽象方法、非抽象方法、构造方法等。一个类只能继承一个抽象类。 - **接口**更适用于定义行为规范,而**抽象类**更适用于提供共通的行为实现。 #### 15. Java中IO流的分类 - Java中IO流主要分为两大类:字节流和字符流。 - **字节流**:处理二进制数据,包括`InputStream`和`OutputStream`。 - **字符流**:处理文本数据,包括`Reader`和`Writer`。 - 每一类中又细分为多种不同的流,例如过滤流、缓冲流、文件流等,用于满足不同的数据处理需求。
- 粉丝: 7
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助