JDK1.8 String常量池详解

JDK1.8 String常量池详解

jdk 1.8

先抛结论

1.只在常量池上创建常量

在这里插入图片描述

2.只在堆上创建对象

在这里插入图片描述

3.在堆上创建对象,在常量池上创建常量

在这里插入图片描述

4.在堆上创建对象,在常量池上创建引用

在这里插入图片描述

注意:

  • 常量池有两种情况:引用(指针) 或 常量。如果该位置已经是引用或常量了,之后的操作都不会改变里面的情况!!!
  • 调用intern()(jdk1.8): 如果常量池里是空的,就创建引用(指向堆,参考结论4);非空,不操作。返回值都是常量池里的内容。
  • 堆中可以有任意个相同的字符串,常量池只能有一个(引用 或 常量)。
  • " " 和intern() 其实很像。区别就是在常量池为空时,“ ”是把值加进去,intern()是把引用加进去。

根据结论解决例子

例一

String s1 = new String("zxy");    // 结论3
s1.intern(); // 常量池非空,返回值是常量池里的内容
String s2 = "zxy"; // 常量池非空,返回值是常量池里的内容
System.out.println(s1 == s2); //false
System.out.println(s1.intern() == s2); // true

在这里插入图片描述

例二

String s1 = "zxy"; // 加到常量池
String s2 = new String("zxy"); // 加到堆,常量池有东西所以啥也不干
System.out.println(s1 == s2); // false
System.out.println(s1 == s2.intern()); // true 常量池非空,intern返回常量池里的内容

在这里插入图片描述

(转载:https://juejin.cn/post/6844903801942441997)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值