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

最近在看字符串相关知识的时候,又看到了关于字符串创建方式和是否相等的相关问题,回忆起之前碰到的一个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();
返回字符串对象的规范表示形式。字符串池最初是空的,由类字符串单独维护。调用intern方法时,如果池中已经包含一个字符串,该字符串等于由equals(object)方法确定的该字符串对象,则返回池中的字符串。否则,该字符串对象将添加到池中,并返回对该字符串对象的引用。因此,对于任意两个字符串s和t,只有当s.equals(t)为真时,s.intern()==t.intern()才为真。所有的文字字符串和字符串值常量表达式都是内部的。String文字在Java语言语言规范的3.3.5节中定义。返回:一个字符串,其内容与此字符串相同,但保证来自唯一字符串池。外部注释:@org.jetbrains.annotations.not空

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

intern方法的测试(jdk1.8)

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

jdk1.8环境下运行结果:

true
false
false
true
true
true
true

其他问题

  • 其中有提到一个new String(" ")会创建几个对象,一般就是一个或两个,主要是看常量池中是否已经有了该字符串,在上述代码在也有所提及。

对于每一个比较语句我都做了自己的理解的标注,比较通俗易懂,仔细看一下就能理解intern方法的作用,另外附上一篇博文,是一篇讲述intern方法的实现原理的博文,对我理解intern方法有很大帮助,感兴趣的朋友可以看一下。
Java技术——你真的了解String类的intern()方法吗

  • 其中提到了 jdk1.7将常量池从方法区中转移到堆 中对intern()方法的影响,非常清晰的描述了差别,配合本博文实例更适宜使用,本博文更多的从实现角度来解析intern()方法,希望对您有所帮助

如有谬误,敬请指正。
欢迎讨论。

String中intern()方法相关推荐

  1. String中intern方法的作用

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

  2. 对String中intern()方法的认识

    最近在看字符串相关知识的时候,又看到了关于字符串创建方式和是否相等的相关问题,回忆起之前碰到的一个String中的intern()方法,它是一个本地方法(由Java语言外的语言编写),因此在jdk1. ...

  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. 基于 OpenCV 的面部关键点检测实战
  2. [国家集训队]happiness 最小割 BZOJ 2127
  3. java中正则全局匹配_JS中正则表达式全局匹配模式/g用法实例
  4. Failed to read auto-increment value from storageengine错误的处理方法
  5. 操作系统以什么方式组织用户使用计算机,操作系统习题
  6. Linux Centos关机命令
  7. (转载)WebSphere MQ安装过程
  8. 12306加密传输_三大运营商发5G消息白皮书:短消息服务升级,支持加密传输
  9. java date 实例_Java Date 和 Calendar 实例
  10. jQuery.position()其实不可靠!
  11. iOS 创建推送证书
  12. Viliv N5 GPS安装及使用方法
  13. 个人工作总结(第一阶段)
  14. Android基础入门
  15. 太实用了!这几个Python数据可视化案例!(文末送书)
  16. Android Studio开发:简单的登录注册界面
  17. 计算机浏览器无法上网怎么办,电脑浏览器上不了网,其他上网正常,怎么解决...
  18. 安装了VCam后,VideoCapture 出问题,FileStorage fs(X.yml, FileStorage::READ)报错
  19. 三核CPU不能安装SP4补丁问题
  20. S5720 telnet配置后无法登陆

热门文章

  1. Android实现二维码扫描功能-ZXing识别图片二维码,相册选图
  2. 扒一扒二维码AGV系统的交管思路
  3. [vijos1474] 雷曼兔(csapc)
  4. smart计算机英语作文,介绍smart cars英语作文【精选】
  5. 如何做选择才不会后悔?
  6. html未知错误,未知错误
  7. matlab编根轨迹程序,matlab在根轨迹绘制中的应用
  8. file format
  9. [转载]大道至简!!!从SAP HANA作为SAP加速器的方式,看ERP on HANA的春天
  10. 江西 南昌 富士康 java,洪城时刻|总投资达110亿!富士康智能科技小镇落户小蓝经开区!...