String str1 = "hello"; String str2 = new String("hello"); String str3 = "hello"; String str4 = str2.intern(); String str5 = str1 + str3;
时间: 2024-02-12 07:26:21 浏览: 99
这段代码一共创建了4个String对象。具体来说:
1. `String str1 = "hello";` 这行代码创建了一个String对象,存储在常量池中。
2. `String str2 = new String("hello");` 这行代码创建了两个String对象:一个存储在堆内存中,另一个存储在常量池中(因为 "hello" 已经在常量池中存在了,所以不需要再创建一个)。注意,这行代码只会在堆内存中创建一个String对象,不会在常量池中创建新的对象。
3. `String str3 = "hello";` 这行代码并没有创建新的String对象,而是将常量池中已经存在的对象赋值给了`str3`。
4. `String str4 = str2.intern();` 这行代码创建了一个String对象,存储在常量池中。因为 `str2` 是在堆内存中创建的,调用 `intern()` 方法后会将其放入常量池中,并返回常量池中的对象。
5. `String str5 = str1 + str3;` 这行代码创建了一个新的String对象,存储在堆内存中。因为字符串的拼接操作会创建一个新的String对象。
相关问题
JAVA String.intern
Java中的String.intern()是一个方法,用于将字符串实例添加到字符串池中,并返回对应的字符串引用。
当我们创建一个字符串时,Java会先检查字符串池中是否已存在该字符串。如果存在,就返回字符串池中的引用;如果不存在,就将该字符串添加到字符串池中,并返回对应的引用。这样可以节省内存空间,提高性能。
下面是一个示例:
```java
String str1 = new String("Hello");
String str2 = "Hello";
String str3 = str1.intern(); // 将str1添加到字符串池中,并返回对应的引用
System.out.println(str1 == str2); // false,因为str1和str2是两个不同的对象
System.out.println(str2 == str3); // true,因为str3指向了字符串池中的同一个对象
```
在上面的示例中,str1和str2是两个不同的字符串对象,因为使用了`new String()`语法创建的字符串会在堆上分配内存空间。而通过调用`intern()`方法,str3指向了字符串池中的同一个对象,所以`str2 == str3`返回true。
需要注意的是,由于字符串池是存在于堆内存之外的,所以当使用`intern()`方法时,可能会增加堆内存的压力。因此,在使用`intern()`方法时需要谨慎考虑内存消耗。
希望对你有帮助!如果你还有其他问题,请继续提问。
string.intern()是干嘛的
`String.intern()` 是 Java 中 String 类的一个静态方法,用于优化字符串的内存管理。当你创建两个完全相同的字符串时(除了它们在堆上的位置不同),Java 的垃圾收集器并不会自动消除这种冗余,因为它们在语法上被认为是不同的引用。这就是所谓的"复制-on-write"(每次修改都会复制整个字符串到新位置)的行为。
`intern()` 方法的作用就是将某个字符串对象标记为“共享”,如果当前 JVM 内存中已经有另一个字符串与之完全匹配(即内容和哈希码都相等),那么这个方法不会创建新的字符串实例,而是返回已经存在的那个实例,这样可以节省内存并减少哈希冲突。这意味着,如果你多次对同一个字符串使用 `intern()`,最终只会有一个副本存在于 JVM 中。
例如:
```java
String str1 = new String("Hello");
String str2 = "Hello";
str2 = str2.intern(); // 此时 str1 和 str2 指向的是同一个内存区域
System.out.println(str1 == str2); // 输出 true
```
阅读全文