先来学习下String str = "qw" + "er";String str = new String("qw") + new String("er") ;的原理。

String str = "qw" + "er";原理

首先用"qw"和"er"拼接成"qwer"之后再直接创建"qwer"字符串,通过==对比会发现两个引用指向同一内存地址。

        String str = "qw" + "er";
        String qwer = "qwer";
        System.out.println(qwer==str);//结果为true

String str = "qw" + "er";的原理,首先会在字符串常量池里分别创建"qw"和"er",之后会在字符串常量池里拼接生成"qwer"。一个引用也不可能指向多个对象(但是,一个对象可以被多个引用指向),所以要拼接出一个字符串再返回唯一地址值。

https://cdn.nlark.com/yuque/0/2020/webp/576791/1608706439949-b5dc10ff-e95a-423f-a0fc-b866a5bfddd1.webp#align=left&display=inline&height=227&originHeight=227&originWidth=517&size=0&status=done&style=none&width=517

一个由多个字符串拼接成的字符串常量,也是个字符串常量。其次一个引用只能指向一个内存地址。所以会在字符串常量池里创建"qwer"字符串返回唯一内存地址。


String str = new String("qw") + new String("er") ;原理

首先用字面值方式创建"qwer"对象,之后用new关键字分别创建"qw"和"er"对象,再用"+"来拼接。再用==比较strqwer的内存地址,返回结果为false。

        String qwer = "qwer";
        String str = new String("qw") + new String("er");
        System.out.println(qwer==str);//结果为false

String str = new String("qw") + new String("er") ;的原理,首先会在字符串常量池里分别创建"qw"和"er",然后会在堆中生成"qw"和"er"两个对象。由于"+"的原因会生成一个新的对象"qwer"。之后"qw"和"er"对象不再可用,垃圾回收器会回收他们。

https://cdn.nlark.com/yuque/0/2020/webp/576791/1608706439960-c2efc9d1-6de3-4b62-81be-e747dcd323f1.webp#align=left&display=inline&height=249&originHeight=249&originWidth=533&size=0&status=done&style=none&width=533

说明String str = new String("qw") + new String("er");创建的对象并没有在字符串常量池里添加的"qwer",而是在堆内存中创建了"qwer"对象。由于这个操作是在堆内存完成的,所以"qwer"不会再添加到字符串常量池中。


String str = "qw" + "er";String str = new String("qw") + new String("er") ;区别:

作者:Kawasaki_MZDA 链接:https://juejin.cn/post/6844903984650518535 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。