1.String str="aaa"; 和String str=new String("aaa");(网上找的两个很好的解答,这里把两个放一起了,两个有重合的地方,但是也可以当成两个分开的小问题)
首先:创建个数
String str=new String("aaa"); 创建了2个字符串对象。一个是“aaa”这个直接量对应的字符串对象;一个是由new String()构造器返回的字符串对象。String str="aaa";只创建了一个“aaa”这个直接量对应的字符串对象。
注意:String str="a"+"b"+"c";这个一共创建了一个对象。
//7
String str10="a";
String str11=str10+"b";
String str12="a"+"b";
System.out.println(str11=="ab");//false
System.out.println(str12=="ab");//true
控制台输出:
以上案列说明了"a"+"b"会被编译器优化,就相当于是“ab”一个对象。所以String str="a"+"b"+"c";等同于String str="abc";
其次 :
String str = "aaa" :s是存储在栈里。
先在栈中创建一个对String类的对象引用变量s,然后查找栈中有没有存放"aaa",如果没有,则将"aaa"存放进栈,并令s指向”aaa”,如果已经有”abc” 则直接令s指向“aaa”。例子如下:String str1 = "aaa";
String str2 = "aaa";
System.out.println(str1==str2); //true
说明str1和str2指向同一个对象
String s = new String("bbb") : s是存储在堆里。
每调用一次就会创建一个新的对象。 例子如下:
String str1 =new String ("bbb");
String str2 =new String ("bbb");
System.out.println(str1==str2); // false
说明str1和str2是不指向同一个对象的
2.StringBuffer相对于String有什么好处:
String可以使用+来连接字符串,但是每当连接一个,就新建一个String对象了。所以这个String就提供了数值不可以改变的字符串。
StringBuffer可以使用append方法来追加字符串,这个是字符串本身发生变化,不会新建类。
同时注意,String有equals方法,StringBuffer没得这个方法
//4
StringBuffer sb=new StringBuffer("eee");
StringBuffer sb2=sb.append("fff");//追加过后,还是同一个对象
System.out.print("测试4结果");
System.out.println(sb==sb2);
//5
String str5="ggg";
String str6=str5+"a";//这边追加过后,是另一个对象了
System.out.print("测试5结果");
System.out.println(str5==str6);
如果我们要追加很多次字符串,用String的开销就很大,速度也要慢些。
例如:将0到9999的数字拼接成一个串:我们看耗时
// 首先使用StringBuffer来追加,我们计算耗时
StringBuffer sb9 = new StringBuffer();
Long startTime1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
sb9.append(i);
}
Long endTime1 = System.currentTimeMillis();
Long costTime1 = endTime1 - startTime1;
System.out.println("使用StringBuffer追加0到999需要时间:" + costTime1);
// 然后使用String来追加,我们计算耗时
String str9 = new String();
Long startTime2 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str9=str9+i;
}
Long endTime2 = System.currentTimeMillis();
Long costTime2 = endTime2 - startTime2;
System.out.println("使用String追加0到999需要时间:" + costTime2);
控制台打印如下: