一文搞懂String的intern()方法
作者:一一哥Sun 发布时间:2022-05-28 12:05:35
一. 先来一段代码
我们先上一段代码:
String str1 = new StringBuilder("你好").append("renr").toString();
String str2 = "你好renr";
System.out.println(str3 == str4);
大家猜猜上面代码的输出结果是什么?true还是false?
321,你猜对了吗?
这里的输出结果是:false!
二. String的intern()方法详解
上面的结果是为什么呢?为了搞清楚这个问题,我们看看需要了解一下intern()方法的内部原理。其实大家可以将String的intern()方法 , 理解为 是 一 个可以 手动将字符串加入常量池中的方法。
在上述代码中,我们知道 "=="比较的是对象的地址, 而 输出 结果为 false, 这就 说明str1和str2的地址不同。而str 2 引用的字符串"你好renr"肯定是放在常量池中的,这就说明str1引用的字符串不在常量池中,而是在堆中。 对于上述现象,我们可以按照下图所示进行理解:
三. 修改代码后再看结果
我们可以对上述代码进行修改,接着再来看一下执行结果,代码如下:
String str3 = new StringBuilder("你好").append("renr").toString();
System.out.println(str3.intern() == str3);
String str4 = "你好renr";
System.out.println(str3 == str4);
现在你再来猜一下上面代码的输出结果,会分别输出什么?
321,我们来公布结果,这次输出的结果为:
true true
来来来,再来给你解释一下:
执行str3.intern()后,str3==str4返回true,这就说明str3和str4引用了同一对象 地址 。
上面我们提到,new StringBuilder("你好").append("renr").toString()
得到的字符串存放在堆中,执行str3.intern()后,会将str3的对象引用放入 到 常量池中 ( jdk1.7后 ) 。
而对str4进行赋值时,发现常量池中已经有了该字符串的引用,则 会 将该引用值直接赋值给str4, 所以 str4也指向 了 str3的对象 ,故 最后输出 结果为 true !
四. 总结
通过对上面代码的解释,现在你搞懂了intern()方法的执行原理了吗?现在请你要记得,intern()的作用就是就是直接将字符串添加到常量池!好了,本篇到此为止。
来源:https://juejin.cn/post/7177630893849182267


猜你喜欢
- 本文实例讲述了Java实现特定范围的完数输出算法。分享给大家供大家参考,具体如下:题目内容:一个正整数的因子是所有可以整除它的正整数。而一个
- 一、IO流的分类字符流ReaderInputStreamReader(节点流)BufferedReader(处理流)WriterOutput
- 今天看《第一行代码》上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo。&nb
- 一、项目简述功能: 用户分为患者,医生,管理员,患者可进行注册选择医生 挂号,选择日期,选择号源,医生可进行接诊,管理员可 对用户,医生信息
- Java Lambda 源码分析问题:Lambda 表达式是什么?JVM 内部究竟是如何实现 Lambda 表达式的?为什么要这样实现?一、
- Map接口存储特点以键(key)值(value)对的形式存储键无序、无下标、元素不可重复值无序、无下标、元素可以重复常用实现类HashMap
- 在MailSetting里的配置好邮件服务器,然后MailEntity里配置好要发送的邮件主体,最后使用MailServer里的方法Send
- 前言面向切面编程,利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发
- 在Word文档中,超链接是指在特定文本或者图片中插入的能跳转到其他位置或网页的链接,它也是我们在编辑制作Word文档时广泛使用到的功能之一。
- 前言学习Java和Android将近一年的时间了,期间的成果应该就是独立完成了一个Android客户端,并且保证了其在主线版本的稳定性。期间
- 前言之前做移动端开发,都不清楚WebService是啥东东,现在接触c#,项目中有三处WebService调用,就不得不与其打交道了,最近碰
- 首先我们建立两个数据库(可以不在同一台电脑上):multiple_order:DROP DATABASE IF EXISTS `multip
- 本文实例讲述了Java简单实现约瑟夫环算法。分享给大家供大家参考,具体如下:1.算法背景:罗马人攻占了乔塔帕特,41人藏在一个山洞中躲过了这
- 在每一个窗体生成的时候,都会针对于当前的窗体定义InitializeComponent()方法,该方法实际上是由系统生成的对于窗体界面的定义
- 我们就可以结合今天的Annotation Processing Tool(APT)来自定义注解处理器。注解处理器简单解释就是收集我们标记的注
- 背景描述通常如果需要一次更新多条数据有两个方式:(1)在业务代码中循环遍历逐条更新。(2)一次性更新所有数据(更准确的说是一条sql语句来更
- StopWatch是位于org.springframework.util包下的一个工具类,通过它可方便的对程序部分代码进行计时(ms级别),
- 一. CodeCache简介从字面意思理解就是代码缓存区,它缓存的是JIT(Just in Time)编译器编译的代码,简言之codeCac
- 这个小游戏是我和我姐们儿的JAVA课程设计,也是我做的第一个JAVA项目,适合初学者,希望能帮到那些被JAVA课设所困扰的孩纸们~~~一、该
- 1. 概述平常我们一般是使用JSON与服务器做数据通信,JSON的话,直接用GSON或者其他库去解析很简单。但是,其他有些服务器会返回XML