JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析
文章目录
- 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++源码解析相关推荐
- 多线程与高并发(七):详解线程池 - 自定义线程池,JDK自带线程池,ForkJoin,源码解析等
Executor 接口关系 Callable:类似于Runnable,但是可以有返回值 Future:存储将来执行的结果.Callable被执行完之后的结果,被封装到Future里面. Future ...
- JVM-白话聊一聊JVM类加载和双亲委派机制源码解析
文章目录 Java 执行代码的大致流程 类加载loadClass的步骤 类加载器和双亲委派机制 sun.misc.Launcher源码解析 Launcher实例化 Launcher 构造函数 双亲委派 ...
- JVM SandBox源码解析(一):启动时初始化、启动时加载模块、ModuleHttpServlet进行Http路由
前言 上篇JVM SandBox实现原理详解文章中,主要解析了JVM SandBox的核心实现原理,并且对SandBoxClassLoader和ModuleClassLoader做了源码解析,也解释了 ...
- JDK源码解析 Runable是一个典型命令模式,Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法
JDK源码解析 Runnable是一个典型命令模式, Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法 /命令接口(抽象命令角色) public interfa ...
- JDK动态代理实现原理详解(源码分析)
无论是静态代理,还是Cglib动态代理,都比较容易理解,本文就通过进入源码的方式来看看JDK动态代理的实现原理进行分析 要了解动态代理的可以参考另一篇文章,有详细介绍,这里仅仅对JDK动态代理做源码分 ...
- JDK源码解析--Object类
作为一名java开发,肯定会知道object类,object类是所有类的基类,当一个类没有直接继承任何类时,默认继承object类,所以也被称之为"上帝类". 目录 一.继承Obj ...
- LiveData 源码解析(2.4.1 版本)
文章目录 1.LiveData 简介 2.LiveData 配置与基本用法 2.1 依赖引入与配置 2.2 基本用法 2.2.1 LiveData 简单使用 2.2.2 LiveData 扩展 2.2 ...
- Java线程池源码解析及高质量代码案例
引言 本文为Java高级编程中的一些知识总结,其中第一章对Jdk 1.7.0_25中的多线程架构中的线程池ThreadPoolExecutor源码进行架构原理介绍以及源码解析.第二章则分析了几个违反J ...
- JDK源码解析——Object的hashCode方法
目录 前言 说明 一.源码目录结构 (1).JDK目录 (2).hotspot目录 二.基础知识 (1).Object Header(对象头) (2).Lock(锁) 1. 无锁 => 偏向锁 ...
最新文章
- 10 个强大的 Apache 模块
- Java的三种代理模式简述
- Error Based Pruning剪枝算法、代码实现与举例
- 计算机在智慧交通的应用论文,智能交通的毕业论文
- 获取内存_如何获取一个进程所占用的内存
- mysql 为了检索从某一个偏移量到记录集的结束所有的记录行_mysql limit 效率分析...
- BranchCache实验(1)总部的服务器配置
- java基础01-java历史
- No usable temporary directory found in [‘/tmp‘, ‘/var/tmp‘, ‘/usr/tmp‘]
- php搜索区分大小写,在php中搜索不区分大小写的xpath
- 程序员代码面试指南第二版 8.单调栈结构(普通及进阶)
- SFI立昌SHA系列方案与应用
- R中设置图形参数--函数par()详解
- 早间简评:黄金亚盘快速下跌 1300关口岌岌可危?
- IIS PHP MYSQL出现问题_iis php mysql
- 掩码、子网掩码及子网划分
- Adobe Photoshop快捷键_艾孜尔江摘录
- 【20】输入一个字符串,统计其中的字母、数字、其他字符的个数。
- 【Java编程】创建人类Person
- Android开发之仿淘宝商品详情页
热门文章
- 提升ListView的运行效率
- 整数、浮点数在计算机中的存储,-128二进制怎么表示,
- Ubuntu 18.04 如何添加或删除 SWAP 交换分区
- sql floor 取整函数
- tf.nn.conv2d 与tf.layers.conv2d的区别
- 递归 算例一(求一个简单嵌套字典的深度)
- 鸿蒙公测报名表填写,鸿蒙公测第二期报名公测版_华为鸿蒙os2.0第二期报名申请内测版 - 风云下载...
- Ubuntu18.04下安装MySQL
- 知识图谱 (知识计算推理)
- 还在埋头写论文?知网检索的这些小技巧让你有如神助!