Java中String对象创建


在开始之前我没了解一下什么叫做字符串驻留

当同时创建多个相同的字符串直接量是,只有一个字符串常量被存储在运行时常量池中。

如:

String a="abc";
String b="abc";
//String c=new String("abc");

此时同时创建了两个String对象(用双引号的方式),此时在运行时常量池中只有一个"abc"。对于String c=new String(“abc”),可以通过c.intern()获取c在运行时常量池里面的字符串驻留对象"abc",所以

String a=new String("abc");
String b=new String("abc");
System.out.println(a==b);//false
System.out.println(a.intern()==b.intern());//true

1 String a="abc"与String b=new String(“abc”)一样吗,难道也是语法糖???

首先是不一样的,不是语法糖。我们看一下以下代码:

 public static void main(String[] args) {
    	String a="abc";
    	String b="abc";
    	String c=new String("Hello world");
    	String d=new String("abc");
    	int length="abc".length();
    }

字节码:
在这里插入图片描述

从字节码中可以看到,String a=“abc"只创建了一个对象(就是”abc”,在运行时常量池)。然而String a=new String(“abc”)会创建额外的对象,看见new没有(意思是在堆上有创建了一个对象)。

a,b两个对象都是用ldc指令将常量"abc"(本身就是一个String类型)加载进操作数栈的,所以a==b是true。然而String d=new String(“abc”)会在堆中新new一个String对象,所以d==b为false。

通常创建String对象时,推荐使用双引号这种方式。因为new的方式会额外创建一个对象。

扫描二维码关注公众号,回复: 4211417 查看本文章

2 String a="abc"要创建几个对象??

通过上面的解释,现在我们就知道了String a=“abc"会创建一个对象(在运行时常量池),而String a=new String(“abc”)会创建两个对象(一个在运行时常量池的"abc”,一个在堆里面)。需要注意的是这是在String a="abc"与String a=new String(“abc”)不同时出现的情况下。

3 String a=“abc”;String b=new String(“abc”)又要创建几个对象???

其实理解上面的这个就好懂了。此时,String a="abc"与String b=new String(“abc”)是同时出现的。那么总共会创建2个对象。

首先String a="abc"在运行时常量池中创建了一个对象。而当String b=new String(“abc”)时,已经知道了运行时常量池中有一个对象"abc"了,那当然就不用在常量池中新创建一个“abc”咯!。只用在堆中创建一个对象就行了。

4 String a=“abc”;String b=“abc”;那么a==b吗???

那当然为true哦。正如前面所讲的,a与b都指向了运行时常量池中的"abc",所以那当然为true了。

5 参考

字符串驻留

猜你喜欢

转载自blog.csdn.net/wobushixiaobailian/article/details/84290697
今日推荐