在Idea中查看变量地址/String Pool和intern()理解

在探讨Java的Stringpool和intern()方法时,示例代码展示了创建两个相同的字符串s1和s2,然后各自调用intern()。预期结果是s1_和s2_指向Stringpool中同一个aaa引用,而s1和s2不同。然而,在实际的debug中发现所有字符串的地址相同,这与预期不符。
摘要由CSDN通过智能技术生成

问题来源

在学习Java的String pool和intern()方法时,有以下例子:

String s1 = new String("aaa");
String s2 = new String("aaa");
String s1_ = s1.intern();
String s2_ = s2.intern();

按道理,以上四个变量的地址,s1与s2不同,s1调用intern()方法,将"aaa"字面值加入String Pool中,返回其引用,注意不是s1,而是池子中的新字符串,s2调用intern()方法时,池子中已经有字符串"aaa"了,所以返回已有的"aaa"的引用。
s1_, s2_的地址应该是相同的,其他的地址与它们不同。

问题表现

用“==”判断上述四个变量的地址关系时,输出与预判相同;
但用debug查看时,所有的地址都相同,和预想不一样,why?
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java ,`String.intern()` 是一个用于字符串对象的方法。它的作用是将字符串对象添加到字符串常量池,并返回常量池该字符串的引用。 具体含义如下: 1. 字符串常量池:Java 的字符串常量池是一个特殊的内存区域,用于存储字符串字面值。当创建字符串时,如果字符串常量池已经存在相同的字符串字面值,则会直接返回常量池的引用,而不会创建新的对象。 2. `String.intern()` 方法:`intern()` 方法是 `String` 类提供的一个实例方法。调用它会检查当前字符串对象在常量池是否存在。如果存在,则返回常量池的引用;如果不存在,则将当前字符串对象添加到常量池,并返回该引用。 使用 `String.intern()` 方法的主要目的是节省内存和提高性能。通过将字符串对象放入常量池,可以重复使用相同的字符串字面值,减少内存占用,并且可以更快地比较字符串的相等性。 例如: ```java String str1 = new String("Hello"); String str2 = str1.intern(); System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true ``` 在上面的例子,`str1` 是通过 `new String("Hello")` 创建的新字符串对象,而 `str2` 是通过 `str1.intern()` 返回的常量池的引用。虽然它们的值相等,但它们是不同的对象,所以 `str1 == str2` 返回 `false`,而 `str1.equals(str2)` 返回 `true`。 需要注意的是,`String.intern()` 方法可能会在某些情况下导致一些性能问题和潜在的内存泄漏。因此,在使用时要注意评估场景和潜在的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值