一、String str = new String()+"a";创建几个对象?与String str1 = new String("b")+"c";和String str2 = new String("")+"d";结果相同吗?
答:创建原理是一样的。
str = new String()+"a":new String()会创建一个堆内存对象,"a"会创建一个字符串常量池的常量"a"对象,使用+拼接,会创建一个StringBuilder对象,拼接""+"a",编译时会初始化成String str = "a",放入字符串常量池中。加上StringBuilder对象共有4个对象。
String str1 = new String("")+"c";String str2 = new String("b");同上。
二、String str = new String("a")+new String("b");会创建几个对象?
new String("a")先去字符串常量池查找有没有"a"常量对象,没有则添加一个,然后此处是new的,所以还会在堆内存创建一个对象,同理new String("b")也是创建了两个对象,使用+会创建StringBuilder对象,调用其append()方法拼接,生成一个新的常量对象放入字符串常量池中。加上StringBuilder对象共有6个对象。
三、创建字符串对象的方式
1、String s = "abc";
2、String s2 = new String("def");
3、String s = s+s2;
4、final String s1 = "123";
final String s2 = "456";
String s = s1+s2;
第一种使用字面量直接创建,先去常量池查找有没有,没有就创建,有之间返回其引用给s(s称为句柄也就是引用对象,存的是String类对象的引用--我把引用理解为地址)。
第二种先去查找常量池有没有"def"常量对象,没有就在常量池创建"def"常量对象,有就不创建,然后在堆内存创建对象并返回堆内存对象的引用给句柄s2。
第三种JVM在编译时会优化成StringBuilder的拼接,String s=new String("abcdef");这里区别于String s = "abc"+"def",优化成String s = "abcdef";
第四种由于是字符串常量拼接,在JVM编译时会直接替换为常量,String s="abc"+"def" ,创建StringBuilder对象调用append()方法区拼接,String s="abcdef";先去字符串常量池查找,找到返回其引用给句柄s,找不到创建并返回其引用。
这里说一下intern()方法,作用:区字符串常量池查找是否存在该字符串(用equals()方法比较),如果存在就返回其引用,不存在就创建对象并返回其引用。(该操作为JDK1.6及以前)