码迷,mamicode.com
首页 > 其他好文 > 详细

jvm的角度理解字符串(常量池与串池、字符串的拼接)

时间:2020-05-08 20:12:04      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:zha   int   地址   字符   ring   string   符号   color   一段   

一、常量池与串池

1、书写代码:

public class test1804 {
    public static void main(String[] args) {
        String string1="a";
        String string2="b";
        String string3="ab";
    }
}

2、查看字节码

技术图片

 

 常量池中的信息,都会被加载到运行时常量池,这时a,b,ab都是常量池中的符号,还没有变为java字符串对象

执行到此处的时候变为字符串对象,被存放在串池中:

技术图片

 

 先去串池(hashtable结构,不能扩容)中查找是否有a,如果已经有a就不会再去创建字符串对象,没有的话 #2会把符号a变为字符串对象a,b和ab一样

 

二、字符串变量的拼接

1、代码

public class test1804 {
    public static void main(String[] args) {
        String string1="a";
        String string2="b";
        String string3="ab";
        String string4=string1+string2;
    }
}

2、字节码

技术图片

 

 3、拼接的过程

技术图片

 

 实质上是执行的下面的一段代码:

new StringBuilder().append("a").append("b").toString();

4、拼接字符串的比较

(1)方式一:

public class test1804 {
    public static void main(String[] args) {
        String string1="a";
        String string2="b";
        String string3="ab";
        String string4=string1+string2;
        System.out.println(string3==string4);
    }
}
false

string3在串池中,string4在堆里面(https://www.cnblogs.com/zhai1997/p/12423092.html

 

方式二:

public class test1804 {
    public static void main(String[] args) {
        String string1="a";
        String string2="b";
        String string3="ab";
        String string4="a"+"b";
        System.out.println(string3==string4);
    }
}
true

字节码执行过程:

技术图片

 

 直接找到拼接好的字符串“ab”,并且存入到地址为5的地方,实际上是javac在编译期的优化,结果已经在编译期确定为字符串“ab”,而上一个拼接是不能在编译期确定的

 

jvm的角度理解字符串(常量池与串池、字符串的拼接)

标签:zha   int   地址   字符   ring   string   符号   color   一段   

原文地址:https://www.cnblogs.com/zhai1997/p/12852654.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!