文章目录

  • Pre
  • 案例
    • 答案
    • 字符串常量池在不同JDK版本的位置变化
    • JDK1.7(含)+
    • JDK1.6
  • intern源码

Pre

JVM - 深入剖析字符串常量池


案例

      String str2 = new StringBuilder("计算机").append("技术").toString();System.out.println(str2 == str2.intern()); String s2 = new StringBuilder("计算机技术").toString();System.out.println(s2 == s2.intern());

读者可以先自行推演一下答案 ,是不是所有的JDK版本都是一样的? 还是说不同的JDK版本的答案不尽相同 ?


答案

        String str2 = new StringBuilder("计算机").append("技术").toString();System.out.println(str2 == str2.intern());  //1.8 true  1.6 falseString s2 = new StringBuilder("计算机技术").toString();System.out.println(s2 == s2.intern());  //1.8 false    1.6 false

【1.6 】

【1.7 】

【1.8】


字符串常量池在不同JDK版本的位置变化

  • Jdk1.6及之前: JVM存在永久代, 运行时常量池在永久代,运行时常量池包含字符串常量池
  • Jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池从永久代里的运行时常量池分离到堆里
  • Jdk1.8及之后: 无永久代,变成了元空间,运行时常量池在元空间,字符串常量池里依然在堆里

String中的intern方法是一个 native 的方法

  • JDK1.7(含) + ,当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串, 否则,将intern返回的引用指向当前字符串

  • jdk1.6版本需要将 s1 复制到字符串常量池里


JDK1.7(含)+

JDK1.6

明白了哈


intern源码

intern 在JDK里是native ,所以只能找C++的代码了。

JDK8对应的哈

看看basic_add 返回的啥

oop : ordinary object pointer 指针

加入到常量池,这个常量池StringTable , 也是个hash结构 ,最后返回string(), 这其实是个指针引用。

so ~ , 这样就好理解intern机制了吧 。

JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析相关推荐

  1. 多线程与高并发(七):详解线程池 - 自定义线程池,JDK自带线程池,ForkJoin,源码解析等

    Executor 接口关系 Callable:类似于Runnable,但是可以有返回值 Future:存储将来执行的结果.Callable被执行完之后的结果,被封装到Future里面. Future ...

  2. JVM-白话聊一聊JVM类加载和双亲委派机制源码解析

    文章目录 Java 执行代码的大致流程 类加载loadClass的步骤 类加载器和双亲委派机制 sun.misc.Launcher源码解析 Launcher实例化 Launcher 构造函数 双亲委派 ...

  3. JVM SandBox源码解析(一):启动时初始化、启动时加载模块、ModuleHttpServlet进行Http路由

    前言 上篇JVM SandBox实现原理详解文章中,主要解析了JVM SandBox的核心实现原理,并且对SandBoxClassLoader和ModuleClassLoader做了源码解析,也解释了 ...

  4. JDK源码解析 Runable是一个典型命令模式,Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法

    JDK源码解析 Runnable是一个典型命令模式, Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法 /命令接口(抽象命令角色) public interfa ...

  5. JDK动态代理实现原理详解(源码分析)

    无论是静态代理,还是Cglib动态代理,都比较容易理解,本文就通过进入源码的方式来看看JDK动态代理的实现原理进行分析 要了解动态代理的可以参考另一篇文章,有详细介绍,这里仅仅对JDK动态代理做源码分 ...

  6. JDK源码解析--Object类

    作为一名java开发,肯定会知道object类,object类是所有类的基类,当一个类没有直接继承任何类时,默认继承object类,所以也被称之为"上帝类". 目录 一.继承Obj ...

  7. LiveData 源码解析(2.4.1 版本)

    文章目录 1.LiveData 简介 2.LiveData 配置与基本用法 2.1 依赖引入与配置 2.2 基本用法 2.2.1 LiveData 简单使用 2.2.2 LiveData 扩展 2.2 ...

  8. Java线程池源码解析及高质量代码案例

    引言 本文为Java高级编程中的一些知识总结,其中第一章对Jdk 1.7.0_25中的多线程架构中的线程池ThreadPoolExecutor源码进行架构原理介绍以及源码解析.第二章则分析了几个违反J ...

  9. JDK源码解析——Object的hashCode方法

    目录 前言 说明 一.源码目录结构 (1).JDK目录 (2).hotspot目录 二.基础知识 (1).Object Header(对象头) (2).Lock(锁) 1. 无锁 => 偏向锁 ...

最新文章

  1. 10 个强大的 Apache 模块
  2. Java的三种代理模式简述
  3. Error Based Pruning剪枝算法、代码实现与举例
  4. 计算机在智慧交通的应用论文,智能交通的毕业论文
  5. 获取内存_如何获取一个进程所占用的内存
  6. mysql 为了检索从某一个偏移量到记录集的结束所有的记录行_mysql limit 效率分析...
  7. BranchCache实验(1)总部的服务器配置
  8. java基础01-java历史
  9. No usable temporary directory found in [‘/tmp‘, ‘/var/tmp‘, ‘/usr/tmp‘]
  10. php搜索区分大小写,在php中搜索不区分大小写的xpath
  11. 程序员代码面试指南第二版 8.单调栈结构(普通及进阶)
  12. SFI立昌SHA系列方案与应用
  13. R中设置图形参数--函数par()详解
  14. 早间简评:黄金亚盘快速下跌   1300关口岌岌可危?
  15. IIS PHP MYSQL出现问题_iis php mysql
  16. 掩码、子网掩码及子网划分
  17. Adobe Photoshop快捷键_艾孜尔江摘录
  18. 【20】输入一个字符串,统计其中的字母、数字、其他字符的个数。
  19. 【Java编程】创建人类Person
  20. Android开发之仿淘宝商品详情页

热门文章

  1. 提升ListView的运行效率
  2. 整数、浮点数在计算机中的存储,-128二进制怎么表示,
  3. Ubuntu 18.04 如何添加或删除 SWAP 交换分区
  4. sql floor 取整函数
  5. tf.nn.conv2d 与tf.layers.conv2d的区别
  6. 递归 算例一(求一个简单嵌套字典的深度)
  7. 鸿蒙公测报名表填写,鸿蒙公测第二期报名公测版_华为鸿蒙os2.0第二期报名申请内测版 - 风云下载...
  8. Ubuntu18.04下安装MySQL
  9. 知识图谱 (知识计算推理)
  10. 还在埋头写论文?知网检索的这些小技巧让你有如神助!