最近在看字符串相关知识的时候,又看到了关于字符串创建方式和是否相等的相关问题,回忆起之前碰到的一个String中的intern()方法,它是一个本地方法(由Java语言外的语言编写),因此在jdk1.8源码中没有其实现,不过有一段描述,讲述了它的作用。
intern()方法的描述

    /*** Returns a canonical representation for the string object.* <p>* A pool of strings, initially empty, is maintained privately by the* class {@code String}.* <p>* When the intern method is invoked, if the pool already contains a* string equal to this {@code String} object as determined by* the {@link #equals(Object)} method, then the string from the pool is* returned. Otherwise, this {@code String} object is added to the* pool and a reference to this {@code String} object is returned.* <p>* It follows that for any two strings {@code s} and {@code t},* {@code s.intern() == t.intern()} is {@code true}* if and only if {@code s.equals(t)} is {@code true}.* <p>* All literal strings and string-valued constant expressions are* interned. String literals are defined in section 3.10.5 of the* <cite>The Java&trade; Language Specification</cite>.** @return  a string that has the same contents as this string, but is*          guaranteed to be from a pool of unique strings.*/public native String intern();

归纳一下的话,它的作用在jdk1.7之后是查看常量池中是否存在和调用方法的字符串内容一样的字符串,如果有的话,就返回该常量池中的字符串,若没有的话,就在常量池中写入一个堆中该字符串对象的一个引用,指向堆中的该对象,并返回该引用。
用代码说话吧,注释中有我对intern()方法的理解,过程中查阅了部分源码和相关博客,如果有谬误,请大家指出,互相交流学习,共同进步。
intern方法的测试

public class InternTest {public static void main(String[] args) {String a = new String("abc");// 第一次,创建了两个对象,一个是堆中的string对象,一个是常量池中的"abc"String b = new String("abc");// 第二次,创建一个对象,堆中的另外一个string对象System.out.println(a.intern() == b.intern());// trueSystem.out.println(a.intern() == b);// falseSystem.out.println(a.intern() == a);// false/** intern方法会到常量池中查找是否存在该对象,如果存在,返回该对象。不存在的话就创建该对象并返回该对象(jdk1.6),(jdk1.7)* 会在常量池中存一个指向堆中的那个对象的引用。 不存在往往是String s3 = new String("1") + new* String("1");这种形式,会在堆中有一个s3指向的11的对象和常量池中的1对象* 在这里就是体现的堆中的内存地址不一样,但对应的同一个常量池中的string 第一个比较时常量池中的该对象和自身比较* 下面两个比较则是常量池中的对象和堆中的两个对象进行比较*/String poolstr = "abc";// 直接从字符串常量池中获取System.out.println(a.intern() == poolstr);// trueSystem.out.println(b.intern() == poolstr);// true/** 这里新声明并赋值了一个poolstr,值为常量池中的字符串"abc",将它和a.intern()和b.inten()比较就是和自身比较*/String str = new String("a") + new String("b");System.out.println(str.intern() == str);// true/** str创建了3个对象,在堆中有一个"ab",在常量池中有一个"a"和"b" 比较str.intern()和str会得到true* 在jdk1.7之后,会在常量池中存一个指向堆中的那个对象的引用。* 调用str.intern()会在常量池中存储一个指向堆中"ab"的引用,也就是说它和堆中的对象实际是等价的,因此==时返回true*/String strtwo = "ab";System.out.println(strtwo == str);// true/** 常量池中已存在ab,所以会直接将strtwo指向常量池中的"ab",即堆中str对象的引用,因此相等*/}
}

其中有提到一个new String(“”)会创建几个对象,一般就是一个或两个,主要是看常量池中是否已经有了该字符串,在上述代码在也有所提及。
对于每一个比较语句我都做了自己的理解的标注,比较通俗易懂,仔细看一下就能理解intern方法的作用,另外附上一篇博文,是一篇讲述intern方法的实现原理的博文,对我理解intern方法有很大帮助,感兴趣的朋友可以看一下。
Java技术——你真的了解String类的intern()方法吗
其中提到了jdk1.7将常量池从方法区中转移到堆中对intern()方法的影响,非常清晰的描述了差别,配合本博文实例更适宜使用,本博文更多的从实现角度来解析intern()方法,希望对您有所帮助
如有谬误,敬请指正。
欢迎讨论。

对String中intern()方法的认识相关推荐

  1. String中intern()方法

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

  2. String中intern方法的作用

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

  3. String中intern的方法

    原文地址:http://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857513.html String中intern的方法 首先查看官方API那个的解 ...

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

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

  5. Java String的intern方法

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

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

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

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

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

  8. String 中 split 方法的效率问题

    问:String 中 split 方法使用时有什么效率问题吗? 答:String 的 split 分割字符串函数我们一般会如下方式使用. String[] arr = "a,b,c" ...

  9. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...

    字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就 ...

最新文章

  1. Security-OAuth2.0 密码模式之客户端实现
  2. On Perseverance
  3. 一键装机linux_linux系统安装,怎样安装linux系统制作步骤
  4. 微软Windows 11正式发布!一文带你了解免费升级方法、最低系统要求
  5. python2.7+pyqt4实现记事本基本功能
  6. Active Learning: 一个降低深度学习时间,空间,经济成本的解决方案
  7. P4行为模型BMV2依赖关系安装:thrift nanomsg nnpy安装
  8. 一个php请求的执行过程,PHP程序执行的过程原理
  9. 自制游戏手柄joystick stm32 hal usb协议
  10. poi创建数据透视表_从数据透视表创建自定义报告
  11. 软件易用性测试怎么做?
  12. mysql数据库有dbo吗_拒绝了对对象 '表名' (数据库 '数据库名',架构 'dbo')的 SELECT 权限...
  13. stm32 火灾自动报警及联动控制源码_火灾自动报警系统设计规范 :联动控制
  14. 微信公众号二维码不同环境差异化处理
  15. python对象模型_python 实现对象模型
  16. 定期备份web工程,压缩为.zip文件
  17. 外包公司,真的是互联网“二等公民”吗?
  18. python模拟生成steam手机二次验证令牌
  19. MyBatis和ORM的区别以及Mybatis和Hibernate的区别
  20. Scratch少儿编程精品课2侏罗纪公园

热门文章

  1. 12306订票助手插件拖垮GitHub事件原因始末
  2. 《读者》的“卷首语” (一)
  3. CMake中macro的使用
  4. HashiCorp Vault浅入门以及资料整理
  5. 记账本简单应用-原生vue的实现对比
  6. P1936 水晶灯火灵
  7. 施金源:9.20黄金走势冲高回落!今日黄金走势操作布局?
  8. 【闲谈】暴露IP地址有危险吗?可查到你下过的小电影
  9. Git给项目打Tag
  10. wish防关联如何做 和亚马逊一样吗