### Java经典面试题详解
#### 1. JDK与JRE的区别
- **JDK (Java Development Kit)**: JDK 是 Java 开发工具包的简称,它包含了编写 Java 应用程序所需的开发工具,如编译器(javac)、调试器(jdb)等,以及文档和其他资源。它是开发 Java 应用程序的基础,对于开发者来说必不可少。
- **JRE (Java Runtime Environment)**: JRE 是 Java 运行环境,包含了 JVM (Java Virtual Machine) 和 Java 核心类库。JRE 主要用于执行 Java 程序,是运行 Java 应用程序所必需的环境。如果你只需要运行 Java 程序,安装 JRE 就足够了。
- **关系**: JDK 包含了 JRE 的所有内容,并且增加了开发工具和文档等资源。这意味着,如果你安装了 JDK,就可以同时拥有开发和运行 Java 程序的能力;而仅安装 JRE 只能运行 Java 程序。
#### 2. == 和 equals 的区别
- **==**: 在 Java 中,`==` 用于比较两个基本类型的数据或两个引用是否相等。
- 对于基本类型,`==` 比较的是它们的值是否相同。
- 对于引用类型,`==` 比较的是它们指向的对象是否是同一个,即内存地址是否相同。
- **equals**:
- `equals` 方法主要用于比较两个对象的内容是否相等。
- 默认情况下,`equals` 方法的行为类似于 `==`,即比较对象的引用是否相同。
- 通常情况下,我们会在类中重写 `equals` 方法来比较对象的具体内容,而不是它们的引用。
#### 3. final 关键字的作用
- **修饰引用**:
- 如果 `final` 修饰的是基本数据类型,那么该变量的值一旦被初始化后就不能改变。
- 如果 `final` 修饰的是引用类型,如对象,那么该引用指向的对象可以改变其状态,但引用本身不能指向另一个对象。
- **修饰方法**:
- 当方法被声明为 `final` 时,意味着该方法不能被子类覆盖(重写)。
- **修饰类**:
- 当类被声明为 `final` 时,该类不能被继承。例如,Java 中的 `String` 类就是一个 `final` 类,因此不能被继承。
#### 4. Math.round(-1.5) 的结果
- `Math.round(-1.5)` 的结果是 `-1`。
- `Math.round` 方法通过加上 0.5 后向下取整的方式来实现四舍五入。
- 对于负数而言,加上 0.5 后向下取整,实际上就是对小数部分进行处理后取最接近的整数,当数字正好位于两个整数中间时,`Math.round` 会向远离零的方向取整。
#### 5. String 是否属于基础的数据类型
- `String` 不属于基础数据类型。Java 中的基础数据类型包括 byte、short、int、long、float、double、char 和 boolean 八种。
- `String` 是一个类,用于表示文本字符串。它可以存储一系列的字符,但不是基本数据类型。
#### 6. String str="i" 与 String str=new String("i") 的区别
- `String str="i"`: 使用这种方式创建的 `String` 对象会被放置在常量池中,如果常量池中已经存在相同的字符串,则不会创建新的对象,而是直接返回已存在的引用。
- `String str=new String("i")`: 这种方式创建的 `String` 对象会被放置在堆内存中,即使字符串完全相同也会创建新的对象。
#### 7. 如何将字符串反转
- 可以使用 `StringBuilder` 或 `StringBuffer` 类的 `reverse()` 方法来反转字符串。
```java
String original = "Hello";
StringBuilder sb = new StringBuilder(original);
String reversed = sb.reverse().toString();
System.out.println(reversed); // 输出 olleH
```
#### 8. String 类的常用方法
- **获取功能**:
- `length()`: 获取字符串的长度。
- `charAt(int index)`: 返回指定索引位置的字符。
- `indexOf(int ch)`: 返回指定字符首次出现的位置。
- `substring(int start, int end)`: 返回一个从指定位置开始到结束位置结束的子字符串。
- **判断功能**:
- `equals(Object obj)`: 比较字符串的内容是否相同。
- `contains(String str)`: 判断字符串中是否包含指定子字符串。
- `startsWith(String str)`: 判断字符串是否以指定字符串开头。
- `endsWith(String str)`: 判断字符串是否以指定字符串结尾。
- `isEmpty()`: 判断字符串是否为空串。
- **转换功能**:
- `getBytes()`: 把字符串转换为字节数组。
- `toCharArray()`: 把字符串转换为字符数组。
- `String.valueOf(char[] chs)`: 把字符数组转换为字符串。
- `toLowerCase()`: 把字符串转换为全小写形式。
- `toUpperCase()`: 把字符串转换为全大写形式。
- `concat(String str)`: 拼接字符串。
- **其他功能**:
- `replace(char oldChar, char newChar)`: 替换字符串中的某个字符。
- `trim()`: 去除字符串两端的空白字符。
- `split(String regex)`: 根据正则表达式分割字符串。
以上知识点涵盖了Java面试中常见的几个方面,帮助准备面试的开发者们更好地理解和掌握Java基础知识。