java程序员面试笔试宝典_java中String,new String,StringBuffer,

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);

控制台打印如下:




猜你喜欢

转载自blog.csdn.net/handsome2013/article/details/80927455
今日推荐