String中的intern

注:intern在jdk1.7之后与之前版本有所改动,区别不大文章后面会提。
先介绍下jvm内存模型:主要是本地方法栈,虚拟机栈,堆,方法区,程序计数器(版本不同时可能方法区没了,记不清1.8以后是不是取消了方法区,非本文重点以后修正)。

  • intern涉及到的主要是堆(存实例对象)方法区(存常量数据)
    代码中用String对象调用intern时,往往是在方法区中生成一个与堆中字符串对应的字符串常量,今后使用同一个常量时减少对堆中对象的访问,防止该对象的引用在以后指向其他String对象,导致获取不一致的String值。
    对一个String变量str1而言,使用已有变量str的intern赋值与直接使用"XXX"赋值会由于顺序的不一致导致不同的结果。

不写了,发现怎么都不如别人总结的好。下面这个博主写得很好了,学习:
https://blog.csdn.net/soonfly/article/details/70147205
主要是弄清楚intern的使用顺序,判断常量池中是否已经存在String对象的值。
弄清楚 -> 编译阶段:做final String的变量拼接时,不需要等到运行期,直接编译期就拼接完成。做String常量拼接也如是。final能够保证代码在初始化阶段安全性,这是jvm的规定,不会受到指令重排的影响。
弄清楚 -> 若对同一个常量值进行多次intern,其实都会指向同一处方法区的位置
弄清楚 -> 1.7之后,intern使用在直接常量赋值前时,方法区存放的堆中String对象的地址,以后无论多少个新的String对象使用intern,其返回值都是指向最初的那个String对象的堆地址,代码举例说明:

public class internTest {
    public static void main(String[] args) {
        String str2 = new String("str")+new String("01");
        str2.intern();
        String str3 = new String("str") + new String("01");
        String tmp = str3.intern();
        System.out.println(str2==tmp); 
    }
}

结果输入:true
结论:str2和tmp指向同一个位置的堆中对象。
分析:这是因为str2.intern时,已经在方法区生成了"str01"的存储位置(保存指向str2的堆地址),str3.intern()判断方法区已有该值不能在方法区新建,共用该值。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容

  • 从网上复制的,看别人的比较全面,自己搬过来,方便以后查找。原链接:https://www.cnblogs.com/...
    lxtyp阅读 1,346评论 0 9
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,621评论 3 83
  • 一、运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、本地方法栈、堆、程序计数器,...
    加油小杜阅读 1,520评论 1 15
  • 其实身为画渣的我一年也摸不了几次笔,昨天看了有插画师的作品,看得我也心痒难耐,所以有了这几张图。 不过在手机上看我...
    刘阿biu阅读 432评论 2 2
  • 记得第一次吃黄焖鸡米饭是在合肥出差,当时很赶时间,还没来得及细细品尝,就开始赶路。但始终记得第一口的味道,一直念念...
    王小妞61阅读 825评论 2 17