软件编程
位置:首页>> 软件编程>> java编程>> 一文搞懂String的intern()方法

一文搞懂String的intern()方法

作者:一一哥Sun  发布时间:2022-05-28 12:05:35 

标签:String,intern,方法

一. 先来一段代码

我们先上一段代码:

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的intern()方法

三. 修改代码后再看结果

我们可以对上述代码进行修改,接着再来看一下执行结果,代码如下:

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

一文搞懂String的intern()方法

四. 总结

通过对上面代码的解释,现在你搞懂了intern()方法的执行原理了吗?现在请你要记得,intern()的作用就是就是直接将字符串添加到常量池!好了,本篇到此为止。

来源:https://juejin.cn/post/7177630893849182267

0
投稿

猜你喜欢

  • 以往都是使用反射调用实例方法,那么反射如何调用静态方法呢?看下面的例子Class<?> threadClazz = Class.
  • mongodb的数据插入速度是其一个亮点,同样的10000条数据,插入的速度要比Mysql和sqlserver都要快,当然这也是要看使用者怎
  • 本文实例讲述了Java Arrays工具类用法。分享给大家供大家参考,具体如下:Arrays类功能描述Arrays类是一个工具类,其中包含了
  • 1.创建阻塞的服务器当 ServerSocketChannel 与 SockelChannel 采用默认的阻塞模式时,为了同时处理多个客户的
  • SpringBoot项目中新增脱敏功能项目背景目前正在开发一个SpringBoot项目,此项目有Web端和微信小程序端。web端提供给工作人
  • 声明:下面的实例全部在linux下尝试,window下未尝试。有兴趣者可以试一下。文章针c初学者。c语言的强符号和弱符号是c初学者经常容易犯
  • 本文实例讲述了C#创建临时文件的方法。分享给大家供大家参考。具体分析如下:C#可以通过Path.GetTempFileName获得一个临时文
  • 目录引言简单遍历筛选符合某属性条件的List集合获取某属性返回新的List集合获取以某属性为key,其他属性或者对应对象为value的Map
  • 这段C#代码主要是验证身份证的开头和身份证的格式和长度是否正确,没有按照身份证的编码规则进行严格验证/// <summary>
  • 本文实例为大家分享了iOS新浪微博分享功能的具体代码,供大家参考,具体内容如下做新浪分享 需先去http://open.weibo.com/
  • 说明:1、集合类型参数化;2、可根据集合中的对象的各个属性进行排序,传入属性名称即可;注:属性必须实现了IComparable接口,C#中i
  • 限流器算法目前常用限流器算法为两种:令牌桶算法和漏桶算法,主要区别在于:漏桶算法能够强行限制请求速率,平滑突发请求,而令牌桶算法在限定平均速
  • 引用类型包含值类型字段,引用类型初始化后,值类型默认会被初始化为0、Null。 CLR允许为值类型定义构造器,但是构造器的调用,就必须显式的
  • WPF实现一个简单的多运算符表达式计算器,供大家参考,具体内容如下1.先看下效果图首先外围给了一个grid 把他分成了两行 第一行用来显示文
  • 本文实例讲述了Java编程实现基于TCP协议的Socket聊天室。分享给大家供大家参考,具体如下:这里使用Socket套接字进行编程,完成的
  • 前言这篇文章主要给大家介绍了关于C#导出pdf的实现方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧方法如下:一.接口部
  • 最近项目里有用到ViewPager来做广告运营位展示,看到现在很多APP的广告运营位都是无限循环的,所以就研究了一下这个功能的实现。先看看效
  • JetBrains JVM Debugger Memory View plugin在我最近的研发活动期间寻找新的工具,以提高我的开发经验,使
  • public class FileAccess{//储存所有文件夹名private ArrayList dirs;public FileAc
  • C#开发,收到下位机串口数据(温度信息),可能是正数也可能是负数,如何转换?第一反应是想起书本上的理论,无符号数表示范围是多少到多少,有符号
手机版 软件编程 asp之家 www.aspxhome.com