我们知道再jvm的运行时内存可以分为堆、方法区、程序计数器、虚拟机栈和本地方法栈。而在方法区中有一个字符串常量池,用来保存字符串这个不可变量。如果我们使用String str=new String("java虚拟机")来new一个string对象,则该对象的实例保存在堆中。如果我们使用String str="java虚拟机"来创建一个字符串,jvm首先会在字符串常量池中创建该String的实例,然后将常量池中该实例的引用返回给str。

new出来的String保存在堆中,如果我们想让字符串常量池中也保存该string的实例呢?可以使用String.intern()这个方法将字符串复制到常量池中,返回在常量池中的引用。

但是在jdk1.7以后,使用String.intern()方法和之前有一些不同。如果字符串在字符串常量池中没有出现过,就会在字符串常量池中保存一个引用,指向堆中该字符串的实例。如果字符串在常量池中已经存在了,就返回常量池中的引用。

我们看一下如下的代码

public static void main(String[] args) {

String str1=new StringBuilder("java").append("虚拟机").toString();//执行完这行代码后,常量池中会有"java"和"虚拟机",但是不会有"java虚拟机"。

System.out.println(str1.intern()==str1);

String str2=new String("我喜欢java"); //执行完这行代码后,常量池中会有"我喜欢java"

System.out.println(str2==str2.intern());

}

结果是

image.png

分析

str1指向的实例是在堆中,是由“java”和"虚拟机"拼接成的。执行完第一句代码后,执行完这句话后,常量池中会有"java"和"虚拟机",但是不会有"java虚拟机"。然后使用str1.intern()会在常量池中保存str1实例的引用,并且返回引用,因此str1.intern()==str1。

而执行完String str2=new String("我喜欢java");后,常量池中会有"我喜欢java",所以在使用str2.intern()返回的就是字符串常量池中的引用,而str2指向的是堆中的引用,因此str2!=str2.intern()。

java intern_java String的intern方法相关推荐

  1. Java之String系列--intern方法的作用及原理

    原文网址:Java之String系列--intern方法的作用及原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的String的intern方法的原理. 常量池简介 在 JAVA 语言中 ...

  2. Java String的intern方法

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  3. [转]String 之 new String()和 intern()方法深入分析

    引入 String,是 Java 中除了基本数据类型以外,最为重要的一个类型了.很多人会认为他比较简单.但是和 String 有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对: Q1:S ...

  4. String中intern()方法

    本文参考 https://blog.csdn.net/believesoul/article/details/79588305 ,我对这篇文章进行了一些小小的整理和修改.这篇文章很好的对intern( ...

  5. String中intern方法的作用

    前言 读完这篇文章你可以了解,String对象在虚拟机内存中的存放,intern的作用,这么多String对象的创建到底有什么区别,String 创建的对象有几个!! 进入正题 先科普几个知识点 1. ...

  6. String的intern方法演示及各种字符串的拼接对比

    演示String的intern方法,以及各种拼接字符串的区别 package string;/*** @Author gzx* @create 2022-1-14 jdk8*/ public clas ...

  7. JAVA中String的split方法

    我的个人网站: http://riun.xyz 以下源码版本:JDK1.8 简介 Java 中 String 的 split 方法可以将字符串根据指定的间隔进行切割,例如字符串 str = " ...

  8. java String的intern()方法

    本文已参与「新人创作礼」活动,一起开启掘金创作之路. 本文章所用jdk版本为jdk1.8 先看第一个例子 public class HelloWorld {public static void mai ...

  9. Java中String类intern()详解

    1.背景 在开发过程中很多朋友,由于不会正确使用intern(),导致开发的程序,执行效率比较差.同时最近发现一道非常有意思的关于intern()的面试题,这道面试题还是有不小的难度,相信很多朋友看到 ...

最新文章

  1. word2007-2010排版中解决段后插入分页符 新页首行空行问题
  2. 【产品干货】衡量移动APP“价值”的9个重要的KPI指标
  3. 快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)...
  4. 计算机在职考研一月联考院校,在职研究生一月联考的分数线是多少?
  5. [js] 写一个方法,当给定数字位数不足8位时,则在左边补充0以补足8位数的方法
  6. Visual Studio 2015开发Android App启动调试始终无法完成应用部署的解决方案
  7. 木鸟民宿发布“中秋国庆出游住宿预测报告” 重庆、长沙最受欢迎
  8. 《幸福就在你身边》第一课、你有追求美好生活的权利【哈佛大学幸福课精华】...
  9. BPTT算法推导以及LSTM是如何解决梯度消失的
  10. iChart--地图显示人口统计
  11. Pygame之滑稽球壁碰
  12. 在Ubuntu18上使用fusedav挂载城通网盘webdav
  13. Python 爬虫 目标:千图网VIP高清无水印下载即用
  14. 当443端口被占用时如何解决?
  15. 《开端》里的循环,人工智能每天都在进行
  16. Internet Download Manager(V6.37版本IDM)免费序列号密钥激活版使用过程中的一些常见问题
  17. 软件测试行业女生真的没有一席之地了吗,还能入行软件测试吗?
  18. 【Eclipse】关闭单词拼写检查
  19. jquery1.7版本核心模块测试封装
  20. 单位内网访问外网的二种方式

热门文章

  1. python相关性分析的散点图怎么做_Python:matplotlib 和 Seaborn 之散点图和相关性 (三十二)...
  2. bin文件用cad打开_dwg文件怎么打开?CAD看图,360°精确识别CAD图块,细节见真章...
  3. nginx location匹配优先级_一分钟搞清楚:Nginx之Location优先级
  4. 睢县职教中心计算机专业18年高考 成绩,南模18年高考成绩喜人!想进这所学校,你需要知道这些~...
  5. html点击子元素隐藏div,jq 点击div,显示当前div内容,隐藏其他div的子元素
  6. 八十三、React简书项目:Styled-Components 与 Reset.css 的结合使用,完成Header布局
  7. 六十四、Vue项目去哪儿网App开发准备
  8. 那份让我想死的化工原理补考试卷
  9. 网页拉起QQ进行交谈
  10. 提升Transformer效率又有新招?基于矩阵分解的线性化Attention方案