2018-07-24(一张图看懂String类型比较)

2018-07-24  本文已影响0人  MiaLing007

先看代码

    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = "hello";
        String s3 = "hello";
        
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
        System.out.println(s2 == s3);
    }

运行结果:

false
true
true

分析虚拟机器中内存如下图


2018-07-24(一张图看懂String类型比较)

字符串存储于方法区的常量区,S2和S3都直接指向常量区地址,但是S1因为是new,会在堆中申请内存,堆中存储的是常量区字符串地址,S1指向堆中内存地址。

再来看一段代码:

    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        String s3 = "helloworld";
        
        String s4 = s1 + s2;
        String s5 = "hello" + "world";
        
        System.out.println(s3 == s4);
        System.out.println(s3 == s5);
    }

输出结果为:

false
true
2018-07-24(一张图看懂String类型比较)

使用new String("")方式创建字符串,会在堆中申请空间,而直接赋值的方式(String s="")创建字符串时,会直接去常量区找。
这里的s4因为是两个变量相加,所以会当成一个新字符串。而s5会在编译时被优化为s5="helloworld"

上一篇下一篇

猜你喜欢

热点阅读