文章目录
在开始之前我没了解一下什么叫做字符串驻留。
当同时创建多个相同的字符串直接量是,只有一个字符串常量被存储在运行时常量池中。
如:
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的方式会额外创建一个对象。
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了。