
获得徽章 19
- 在这个世界上来活一次,我们最需要救那个人是自己。不是别人。
我由无数个众生组成,什么样的众生组成什么样的自己,有什么样的人生和经历。最终要救的是自己。自己身上携带的众生跟毒。除了自己救自己,别人没办法救。
一定任何时候生出光,自己救自己,自己不放弃自己。评论2 - 请说说new String("A")和String("A")分别返回的结果,请解释为什么?
在 Java 中,`new String("A")` 和 `String("A")` 的使用会产生不同的结果,主要体现在内存分配和字符串常量池的概念上。
### 1. `new String("A")`
当你使用 `new String("A")` 时,实际上会创建一个新的 `String` 对象。这个对象会被分配在堆内存中,即使字符串常量 `"A"` 已经在字符串常量池中存在。无论常量池中是否已经有相同内容的字符串,`new` 关键字都会导致新对象的创建。
```java
String str1 = new String("A");
```
### 2. `String("A")`
通常情况下,`String("A")` 的写法是错误的,应该是 `String.valueOf("A")` 或者直接使用 `"A"`。在 Java 中,字符串常量会被放入字符串常量池。使用字符串字面量时,比如:
```java
String str2 = "A";
```
Java 会检查常量池中是否已经存在 `"A"` 这个字符串。如果存在,`str2` 将指向常量池中已有的 `"A"`。如果不存在,Java 会将其添加到常量池中。
### 结果比较
```java
String str1 = new String("A");
String str2 = "A";
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
```
1. `str1 == str2` 返回 `false`,因为 `str1` 是堆中的新对象,而 `str2` 指向常量池中的 `"A"`,它们的内存地址不同。
2. `str1.equals(str2)` 返回 `true`,因为 `equals` 方法比较的是字符串的内容,而不是内存地址。
### 总结
- `new String("A")` 在堆内存中创建了一个新的对象,永远不会指向常量池中的内容。
- 使用字符串字面量 `"A"` 时,Java 会优先使用常量池中的对象,节省内存。
- 使用 `new` 关键字展开评论7