常问

创建对象个数不同 String str="abc"只在字符串常量池里创建一个对象。(如果字符串常量池里有"abc",则一个都不创建直接返回地址值给str)String str = new String("abc")在堆内存和字符串常量池各创建一个对象。(如果字符串常量池里有"abc",则只在堆内存创建对象并返回地址值给str)

String str ="abc"原理

String str ="abc"的原理,采用字面值的方式创建时,JVM会先去字符串常量池中去查找是否存在"abc"这个对象,如果不存在就创建这个字符串,并把地址返回给str。如果存在则直接把"abc"这个字符串的地址返回给str

https://cdn.nlark.com/yuque/0/2020/webp/576791/1608705861025-2fc915bb-c6c5-4f41-b5ed-68f3d8d191a3.webp#height=221&id=ULYhw&originHeight=221&originWidth=504&originalType=binary&ratio=1&size=0&status=done&style=none&width=504

        String x = "abc";
        String y = "abc";
        System.out.println(x==y);//结果为true

https://cdn.nlark.com/yuque/0/2020/webp/576791/1608705861283-38014404-d263-459a-a549-f94805a75526.webp#height=229&id=a1KWw&originHeight=229&originWidth=526&originalType=binary&ratio=1&size=0&status=done&style=none&width=526


String str = new String("abc")原理

String str = new String("abc")采用new关键字的方式创建,JVM也会去字符串常量池中查找有没有这个字符串,如果没有的话,就先在字符串常量池里创建"abc"这个字符串,然后再复制一份放在堆里并把地址返回给str。如果字符串常量池里存在该字符串,那么就直接复制一份放在堆里并把地址返回给str

https://cdn.nlark.com/yuque/0/2020/webp/576791/1608705861297-04a7f6b6-fd5e-4b8e-b0a9-9ba0372ac955.webp#height=256&id=gEgtG&originHeight=256&originWidth=528&originalType=binary&ratio=1&size=0&status=done&style=none&width=528

        String x = new String("abc");
        String y = new String("abc");
        System.out.println(x == y);//结果为false

https://cdn.nlark.com/yuque/0/2020/webp/576791/1608705861301-7a9d5690-464a-4712-b9c4-2d6c19f2eafb.webp#height=237&id=S29DX&originHeight=237&originWidth=517&originalType=binary&ratio=1&size=0&status=done&style=none&width=517


String str="abc"String str = new String("abc")的区别总结为:

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

String s = new String("abc") 创建了2个对象的原因