字符串常量池-常量项(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/

Java中几种常量池的区分

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的更多相关文章

  1. 常量池之字符串常量池String.intern()

    运行时常量池是方法区(PermGen)的一部分. 需要提前了解: 1. JVM内存模型. 2. JAVA对象在JVM中内存分配 常量池的好处 常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现 ...

  2. 结合字符串常量池/String.intern()/String Table来谈一下你对java中String的理解

    1.字符串常量池 每创建一个字符串常量,JVM会首先检查字符串常量池,如果字符串已经在常量池中存在,那么就返回常量池中的实例引用.如果字符串不在池中,就会实例化一个字符串放到字符串池中.常量池提高了J ...

  3. [JAVA]字符串常量池String pool

    字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定.不仅如此,还可以使用 String 的 intern() 方法在运行过程中将 ...

  4. JVM字符串常量池StringTable

    String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式: String s2 = ...

  5. String之常量池小结

    1.String 常量池 String使用private final char value[ ]实现字符串的存储,也就是说String创建对象之后不能够再次修改此对象中存储的字符串内容,因而Strin ...

  6. 深入理解JVM内存分配和常量池

    一.虚拟机的构成 虚拟结主要由运行时数据区.执行引擎.类加载器三者构成: 而我们所说的JVM内存模型指的就是运行时数据区,下面具体分析一下运行时数据区: 二.运行时数据区组成和各个区域的作用 我们看到 ...

  7. 【JVM】Java 8 中的常量池、字符串池、包装类对象池

    1 - 引言 2 - 常量池 2.1 你真的懂 Java的“字面量”和“常量”吗? 2.2 常量和静态/运行时常量池有什么关系?什么是常量池? 2.3 字节码下的常量池以及常量池的加载机制 2.4 是 ...

  8. JVM中的常量池详解

    在Java的内存分配中,总共3种常量池: 转发链接:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Stri ...

  9. JVM中的常量池

    在Java的内存分配中,总共3种常量池: ref:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Strin ...

随机推荐

  1. UOJ#219/BZOJ4650 [NOI2016]优秀的拆分 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9025092.html 题目传送门 - UOJ#219 (推荐,题面清晰) 题目传送门 - BZOJ4650 题意 ...

  2. 不同路径II(一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。)

    示例 1: 输入: [   [0,0,0],   [0,1,0],   [0,0,0] ] 输出: 2 解释: 3x3 网格的正中间有一个障碍物. 从左上角到右下角一共有 2 条不同的路径: 1. 向 ...

  3. JAVA首次课堂测试总结

    暑期生活已经结束,新的学期也已经开始,而暑期放假之前约定的JAVA首次课堂测试也如期的到来,本次测试真的可以学到和多东西,也有很多感想. 首先体会最深的就是系主任所说的软件工程不是那么好学的,真的需要 ...

  4. ZOJ 1109 Language of FatMouse 【Trie树】

    <题目链接> 题目大意: 刚开始每行输入两个单词,第二个单词存入单词库,并且每行第二个单词映射着对应的第一个单词.然后每行输入一个单词,如果单词库中有相同的单词,则输出它对应的那个单词,否 ...

  5. SpringBoot使用WebFlux响应式编程操作数据库

    这一篇文章介绍SpringBoot使用WebFlux响应式编程操作MongoDb数据库. 前言 在之前一篇简单介绍了WebFlux响应式编程的操作,我们在来看一下下图,可以看到,在目前的Spring ...

  6. MySQL安装目录修改

  7. JS运算符问题

    以下代码是否报错,如果不报错输出什么,为什么 var x = !!"Hello" + (!"world", !!"from here!!") ...

  8. ajax中的async属性值之同步和异步及同步和异步区别

    jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...

  9. 如何使用单例模式返回一个安全的Connection

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public clas ...

  10. OpenStack--Havana

    OpenStack provides an Infrastructure as a Service (IaaS) solution through a set ofinterrelated servi ...