jvm理论-常量池-string
字符串常量池-常量项(cp_info)结构
CONSTANT_String_info{
u1 tag=8;
u2 string_index;//存放 CONSTANT_Utf8_info 指针
}
CONSTANT_Utf8_info{
u1 tag=1;
u2 length;//字节数组长度
u1 bytes[length];//使用utf8编码后的字节数组
}
案例1
public class StringDemo {
private String s1="字符串S1";
}
javac StringDemo.java
javap -verbose StringDemo.class

#15:CONSTANT_Utf8_info结构体
CONSTANT_Utf8_info{
u1 tag=1;
u2 length;//字节数组长度
u1 bytes[length];//使用utf8编码后的字节数组
}
#2:CONSTANT_String_info结构体
CONSTANT_String_info{
u1 tag=8;
u2 string_index;//存放#15
}
案例2
public class StringDemo {
private String s1="MyStr1";
private String s2="MyStr1";
}
javac StringDemo.java
javap -verbose StringDemo.class

案例3
public class StringDemo {
private String s1= new String("MyStr1");
}

案例4
public class StringDemo20 {
private String s1="MyStr1";
private String s2="MyStr1";
private String s3="My"+"Str1";
private String s01="My";
private String s02="Str1";
private String s4 = s01+s02;
private String s5 = s4.intern();
private static String str1="MyStr1";
private static String str2="MyStr1";
private static String str3="My"+"Str1";
private static String str01="My";
private static String str02="Str1";
private static String str4 = str01+str02;
private static String str5 = str4.intern();
private static final String fstr1="MyStr1";
private static final String fstr2="MyStr1";
private static final String fstr3="My"+"Str1";
private static final String fstr01="My";
private static final String fstr02="Str1";
private static final String fstr4 = fstr01+fstr02;
private static final String fstr5 = fstr4.intern();
class InnerDemo{
private String s1="MyStr1";
private String s2="MyStr1";
private String s3="My"+"Str1";
private String s01="My";
private String s02="Str1";
private String s4 = s01+s02;
private String s5 = s4.intern();
private static final String ifstr1="MyStr1";
private static final String ifstr2="MyStr1";
private static final String ifstr3="My"+"Str1";
private static final String ifstr01="My";
private static final String ifstr02="Str1";
private static final String ifstr4 = ifstr01+ifstr02;
//private static final String ifstr5 = ifstr4.intern();
}
public static void main(String[] args){
StringDemo20 stringDemo = new StringDemo20();
System.out.println("s1==s2:"+(stringDemo.s1==stringDemo.s2));
System.out.println("s1==s3:"+(stringDemo.s1==stringDemo.s3));
System.out.println("s1==s4:"+(stringDemo.s1==stringDemo.s4));//false
System.out.println("s1==s5:"+(stringDemo.s1==stringDemo.s5));
System.out.println("s1==str1:"+(stringDemo.s1==StringDemo20.str1));
System.out.println("s1==str3:"+(stringDemo.s1==StringDemo20.str3));
System.out.println("s1==str4:"+(stringDemo.s1==StringDemo20.str4));//false
System.out.println("s1==str5:"+(stringDemo.s1==StringDemo20.str5));
System.out.println("s1==fstr1:"+(stringDemo.s1==StringDemo20.fstr1));
System.out.println("s1==fstr3:"+(stringDemo.s1==StringDemo20.fstr3));
System.out.println("s1==fstr4:"+(stringDemo.s1==StringDemo20.fstr4));
System.out.println("s1==fstr5:"+(stringDemo.s1==StringDemo20.fstr5));
System.out.println("s1==innerdemo.fstr1:"+(stringDemo.s1==InnerDemo.ifstr1));
System.out.println("s1==innerdemo.fstr3:"+(stringDemo.s1==InnerDemo.ifstr3));
System.out.println("s1==innerdemo.fstr4:"+(stringDemo.s1==InnerDemo.ifstr4));
}
}
javap -verbose StringDemo20.class >d:/1.txt



可以看到 str1、str2、str3、str5都是 ldc #22。

可以看到 str1、str2、str3都是 ldc #22。s5在运行期间,放入运行时常量池。

推荐:
http://www.ciaoshen.com/2016/07/29/string/
http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/
Thinking in Java 读书笔记:第十三章 - 字符串
https://www.zhihu.com/question/29884421/answer/113785601
http://rednaxelafx.iteye.com/blog/774673
http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html
jvm理论-常量池-string的更多相关文章
- 常量池之字符串常量池String.intern()
运行时常量池是方法区(PermGen)的一部分. 需要提前了解: 1. JVM内存模型. 2. JAVA对象在JVM中内存分配 常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现 ...
- 结合字符串常量池/String.intern()/String Table来谈一下你对java中String的理解
1.字符串常量池 每创建一个字符串常量,JVM会首先检查字符串常量池,如果字符串已经在常量池中存在,那么就返回常量池中的实例引用.如果字符串不在池中,就会实例化一个字符串放到字符串池中.常量池提高了J ...
- [JAVA]字符串常量池String pool
字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定.不仅如此,还可以使用 String 的 intern() 方法在运行过程中将 ...
- JVM字符串常量池StringTable
String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式: String s2 = ...
- String之常量池小结
1.String 常量池 String使用private final char value[ ]实现字符串的存储,也就是说String创建对象之后不能够再次修改此对象中存储的字符串内容,因而Strin ...
- 深入理解JVM内存分配和常量池
一.虚拟机的构成 虚拟结主要由运行时数据区.执行引擎.类加载器三者构成: 而我们所说的JVM内存模型指的就是运行时数据区,下面具体分析一下运行时数据区: 二.运行时数据区组成和各个区域的作用 我们看到 ...
- 【JVM】Java 8 中的常量池、字符串池、包装类对象池
1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是 ...
- JVM中的常量池详解
在Java的内存分配中,总共3种常量池: 转发链接:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Stri ...
- JVM中的常量池
在Java的内存分配中,总共3种常量池: ref:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Strin ...
随机推荐
- Ajax+PHP实现异步上传多张图片
Ajax+PHP实现异步上传多张图片 HTML代码 <!-- date: 2018-04-27 13:46:55 author: 王召波 descride: 多张图片上传 --> < ...
- BZOJ2553 [BeiJing2011]禁忌 AC自动机 矩阵
原文链接http://www.cnblogs.com/zhouzhendong/p/8196279.html 题目传送门 - BZOJ2553 题意概括 引用一下lych大佬的: 在字母只有前alph ...
- HDU6031 Innumerable Ancestors 倍增 - 题意详细概括 - 算法详解
去博客园看该题解 题目 查看原题 - HDU6031 Innumerable Ancestors 题目描述 有一棵有n个节点的有根树,根节点为1,其深度为1,现在有m个询问,每次询问给出两个集合A和B ...
- P1378 油滴扩展 dfs回溯法
题目描述 在一个长方形框子里,最多有N(0≤N≤6)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能放置下一个油滴. ...
- JavaSE | 接口| 枚举| 注释| 异常
包: 1.包的作用:(1)避免类的同名(区分类):类的全名称:包.类名 回忆:java.util.Scannerjava.util.Arraysjava.lang.Stringj(2)可以限定某些类或 ...
- Python Enum 枚举 用法汇总
Python Enum 枚举 用法汇总 import os import sys if sys.version_info.major + sys.version_info.minor * 0.1 &l ...
- python基础篇_001_初识Python
一.Python环境 windows环境安装Python步骤 .下载安装包:https://www.python.org/downloads/windows/ .安装:默认安装路径:C:\pytho ...
- rem+media+jquery布局结局方案
; ; } ? ; + 'px'; } document.addEventListener('DOMContentLoaded', callback); window.addEventListener ...
- DDoS攻击与防御(1)
分布式拒绝服务攻击的精髓是,利用分布式的客户端,向服务提供者发起大量看似合法的请求,消耗或长期占用大量资源,从而达到拒绝服务的目的.从不同的角度看,分布式拒绝服务攻击的方法有不同的分类标准.依据消耗目 ...
- Manjaro安装配置笔记
简单介绍: Manjaro和Ubuntu的都使用有段时间了,还是AUR大法用着舒服趁着由KDE桌面更换deepin时系统崩溃,直接重装了系统,版本:Manjaro-deepin-17.1.7-x86_ ...