美文网首页
Java String

Java String

作者: sunpy | 来源:发表于2018-08-07 14:42 被阅读10次

介绍

String类经常出现在我们的开发中,如果问你String类相关的常识,会回答String类是final修饰的,所以是不可继承的。而String类的一些深层问题需要我们深入思考。

String str = "123"和String str2 = new String("123")的区别

public static void main(String[] args) {
    String str = "123";
    String str2 = new String("123");
}
String str = "123":

在jdk7上jvm上有块方法区上面有个常量池,在编译期将常量池中的信息放入class文件中。如果之前有String常量值为123,那么直接将复制引用。如果没有String常量值为123,那么就创建String常量123。

String str2 = new String("123"):

在堆内存上开辟空间存放String对象值为123,如果之前在常量池已经创建了String常量值123,那么此时无需再创建常量值,如果常量池未创建,那么还需要创建String常量值123。

String字符串常量比较相等

情况1

public class StringTest {
    public static void main(String[] args) {
        String str1 = "123";
        String str2 = "123";
        System.out.println(str1 == str2);
    }
}

结果:


1.png

解释:此处问题就可以深究了,到底是创建的两个String值相同,还是因为两个String对象引用相同?答案就是两个String对象的引用相同。
使用 javap -verbose StringTest.class查看


2.png
可以发现变量str1和str2都指向了常量池中第16个字符串常量。可以发现str1和str2都指向了同一个字符串常量123。过程就是先去常量池里面去查找有没有"123"这个字符串常量,没有就创建这个字符串常量,如果有这个字符串常量,那么将str1指向字符串常量的地址,同理str2。

情况2

public class StringTest {
    public static void main(String[] args) {
        String str1 = new String("123");
        String str2 = new String("123");
        System.out.println(str1 == str2);
    }
}
4.png

解释:在jvm的堆上开辟一个空间用来存放String对象,str1和str2因为分别存在不同的堆上,所以比较地址不同。

字符串 " + " 的弊端

    public static void main(String[] args) {
        String str = "123";
        System.out.println(str + "456");
    }
1.png

解释:可以发现当我们使用+进行拼接字符串时,实际上给我们创建了一个StringBuilder,然后采用StringBuilder中的append方法进行拼接的。如果我们每次都写+,那么每次都创建一个StringBuilder这样明显是不合理的。所以以后字符串拼接直接写StringBuilder拼接,而不是写+。

相关文章

网友评论

      本文标题:Java String

      本文链接:https://www.haomeiwen.com/subject/ocuovftx.html