字符串常量池-常量项(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. L3-001 凑零钱 (30 分) dfs加后缀剪枝

    韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 1 枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...

  3. 初窥Java之五

    一.方法 1.语法格式 修饰符  返回值类型 方法名(形参列表){ 方法体 } 2.返回值类型 返回值类型可以时:1.void(无返回值) 2.8大基本数据类型中的任意一种 3.引用数据类型中的任意一 ...

  4. Java大数相乘-hdu1063

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1063 题目描述: 代码实现: import java.util.Scanner; import jav ...

  5. ACM-ICPC 2018 南京赛区网络预赛 L 【分层图最短路】

    <题目链接> 题目大意: 有N个城市,这些城市之间有M条有向边,每条边有权值,能够选择K条边 边权置为0,求1到N的最短距离. 解题分析: 分层图最短路模板题,将该图看成 K+1 层图,然 ...

  6. mybatis查询语句的背后之参数解析

    转载请注明出处... 一.前言 通过前面我们也知道,通过getMapper方式来进行查询,最后会通过mapperMehod类,对接口中传来的参数也会在这个类里面进行一个解析,随后就传到对应位置,与sq ...

  7. XamarinEssentials教程应用程序信息AppInfo

    XamarinEssentials教程应用程序信息AppInfo   很多应用程序都提供一个“关于”功能.该功能会向用户展示应用程序的基本信息,如版本号.应用程序名称等.这个功能可以通过Xamarin ...

  8. JMeter-java.lang.OutOfMemoryError: PermGen space错误

    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被 ...

  9. 【转】Linux服务部署--Java(三) Nginx

    原文地址:Nginx Linux详细安装部署教程 一.Nginx简介 Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,具体简介我就不介绍了百度一下有很多,下 ...

  10. 使用requests进行模拟登陆

    import re import requests header = { 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWe ...