最近在看字符串相关知识的时候,又看到了关于字符串创建方式和是否相等的相关问题,回忆起之前碰到的一个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. 【翻译】(5)Android.mk File
  2. array,arraylist,string的总结
  3. c# 蓝牙虚拟串口_蓝牙模块——基础知识介绍
  4. 用c语言开发图形界面,「分享」C语言如何编写图形界面
  5. icinga-report+jasperserver+icinga-web安装步骤
  6. idea 快速导入实现父类方法_三步快速提高物理成绩!准初三生暑假实现逆袭的实用方法...
  7. 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句...
  8. 事务超时时间无效_架构设计 | 基于消息中间件,图解柔性事务一致性
  9. Atitit 数据库重复数据产生原因与解决总结 目录 1. 原因 1 1.1. 缺少数据约束校验 1 1.2. 表关系关联设计错误 1 2. 约束种类 1 2.1. 分类 表级约束vs列级别约束 2
  10. 代理服务器为何受欢迎?
  11. undefined reference to `__stack_chk_guard‘ .. undefined reference to `__stack_chk_fail‘
  12. Error: While importing ‘run_app_dev‘, an ImportError was raised.
  13. Espresso指南一(Espresso下载、安装、设置、基础、速查表)
  14. UVM m_sequencer 和 p_sequencer
  15. 关于不同体系结构风格的简单认识
  16. 简信CRM:超实用的移动CRM选型参考指南
  17. 想健身该怎么做?要练出肌肉需要多久?
  18. 液晶显示器点屏方法步骤及参数表
  19. 女人一生必看的15部电影
  20. python模拟比赛测试胜率

热门文章

  1. C语言当中的实际参数及形式参数
  2. vb资源下载 长期有效
  3. 计算机视觉:Opencv图像去畸变
  4. 进销存设计与分析_盘点单(9)
  5. Date Vault 概念
  6. 隐终端效应和暴露终端效应
  7. 简易中文自动文摘系统(合集)
  8. 基于TextRank算法的自动文摘
  9. 深度学习技巧应用7-K折交叉验证的实践操作
  10. 鬼谷子《本经阴符七术》上:千古奇人奇文,以一人之力颠覆全世界