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 ...
随机推荐
- 20165319第五周java学习笔记
教材内容总结 1.String类和StringBuffer类都覆盖了toString方法,都是返回字符串. 所以带不带toString效果是一样的. 2.instanceOf运算符可以用来判断某个对象 ...
- List集合remove元素的问题
import java.util.*; public class object { public static void main(String[] args) { String str1 = new ...
- Windows10 下Apache服务器搭建
Windows10 下Apache服务器搭建 转 https://blog.csdn.net/sunqian666888/article/details/78561399 目录 一.软件下载 二. ...
- lvs三种模式的配置
- SpringCloud学习目录
Spring Cloud直接建立在Spring Boot的企业Java创新方法上,它通过实现经过验证的模式来简化分布式.微服务风格的体系结构,从而为您的微服务带来弹性.可靠性和协调. 以上来自spri ...
- seq2seq升级TF1.5后_Linear报错
解决TF升级到1.5之后seq2seq.py出现的引用报错: 1.4时候使用rnn_cell_impl的_Linear没有问题的,TF升级到1.5之后这一行就运行不过去了,查到的方法是引用core_r ...
- Java数组常用方法
数组基础:http://www.cnblogs.com/mengdd/archive/2013/01/04/2844264.html import java.util.Arrays; 1):创建数组 ...
- Java读取接口中的数据,并保存到txt文件中!
//创建读取接口中数据的方法 public static String read() { URL url = null; BufferedReader reader = null; HttpURLCo ...
- Codeforces.468C.Hack it!(构造)
题目链接 \(dls\)出的比赛诶...这么妙. \(Description\) 令\(f(x)\)表示整数\(x\)在十进制下各个数位的数字之和.给定\(a\),求两个整数\(l,r\),使得\(\ ...
- 潭州课堂25班:Ph201805201 django 项目 第五课 静态页面转为模板 (课堂笔记)
一.分析静态页面 1.静态vs动态 条目 静态页面 动态页面 网站内容 固定不变 经常变动 浏览器加载速度 更快(无需向服务器发起请求) 更慢 改变网站内容 很难(修改或者创建新的html页面) ...