吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1293|回复: 0
收起左侧

[Java 原创] 【原创源码】【JAVA】+String.intern()理解

[复制链接]
rwkk12138 发表于 2021-10-14 16:12
本帖最后由 rwkk12138 于 2021-10-14 17:37 编辑

先看以下代码
[Java] 纯文本查看 复制代码
	public static void main(String[] args) {
		String s1 = new StringBuilder("b").append("ad").toString();
		String s2 = "bad";
		System.out.println(s1.intern() == s1);
		System.out.println(s1 == s2);
		String s3 = new StringBuilder("go").append("od").toString();
		System.out.println(s3.intern() == s3);
		String s4 = "good";
		System.out.println(s3 == s4);
		String s5 = new StringBuilder("ja").append("va").toString();
		System.out.println(s5.intern() == s5);
	}


结果输出是:
false
false
true
true
false

翻阅文档,找到了Java intern() 方法的介绍

intern() 方法返回字符串对象的规范化表示形式。它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。参数:无返回值:一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
在自己搞明白这个方法的规则后,我小结了以下几点:
1.在debug查看对象的时候s1.intern()返回的是s2堆地址,查阅相关资料后发现JDK1.7之后调用intern方法后不在将堆中的常量副本拷贝到常量池中,替代的是在常量池中生成一个对字符串的引用
2.调用intern()方法时的大概流程是先去常量池中寻找字符串是否存在,找到则返回改字符串的引用,否则将在常量池中生成一个对原来字符串的引用
3.同样的如果直接使用字面量去创建字符串对象时也是与调用intern()方法流程同样,只不过是在编译期间进行的,经实践发现即使使用‘+’连接,也会在编译期间直接将字符串存入常量池中

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 14:37

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表