`

String和StringBuffer

阅读更多

String是不可变的字符序列,一旦被创建,就不能修改它的值.对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.

@Test
    public  void TestString() {
		String s1="hello ";
		String s2="world";
		long start=System.currentTimeMillis();
		for(int i=0;i<10000;i++){
			s1+=s2;
		}
		long end=System.currentTimeMillis();
		System.out.println("消耗时间:"+(end-start)+"ms");//932ms
	}

 

 

StringBuffer是可变的字符序列,当对他进行修改的时候不会像String那样重新建立对象 ,它只能通过构造函数来建立,对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer中赋值的时候可以通过它的append方法.

@Test
    public  void TestStringBuffer() {
		StringBuffer s1=new StringBuffer("hello ");
		String s2="world";
		long start=System.currentTimeMillis();
		for(int i=0;i<10000;i++){
			s1=s1.append(s2);
		}
		long end=System.currentTimeMillis();
		System.out.println("消耗时间:"+(end-start)+"ms");//3ms
	}

 

 

从结果看来StringBuffer的效率要比String高的多,这和他们的运行机制有关。 

s1+=s2运行时在内存中的情况:

    

 

可见在s1+s2时系统会在内存中新开辟一块空间然后把S1和S2的内容拷贝过去再把S1重新指向这块新的空间。(不可变的字符序列)

 s1=s1.append(s2)运行时在内存中的情况:



可见在s1=s1.append(s2)时系统会在S1指向的内存后开辟内存,然后把S2内容拷贝过去。(可变的字符序列)

 

  • 大小: 25.8 KB
  • 大小: 15.9 KB
5
4
分享到:
评论
7 楼 yixiandave 2013-06-13  
鳄鱼旭 写道
不知道你是用JDK的哪个版本测试的,我记得没错的话在JDK6以后的版本对String的拼接在编译上做了优化,使用类似于StringBuilder的方式实现String +操作的的效果,如果上面的代码在优化之列的话,效率应该是差不多的。

是这样吗,有空去测试下看看

不过JDK7的String源码里面依然是final char[] value啊,无论如何都需要重新创建对象的吧
6 楼 鳄鱼旭 2013-06-13  
不知道你是用JDK的哪个版本测试的,我记得没错的话在JDK6以后的版本对String的拼接在编译上做了优化,使用类似于StringBuilder的方式实现String +操作的的效果,如果上面的代码在优化之列的话,效率应该是差不多的。
5 楼 forGG 2013-06-13  
这个无需讨论,在think in java中有说明!!
创建一个string在底层是通过先创建StringBuilder来实现的!
4 楼 Elvin.Chu 2013-06-11  
不错,挺好的
3 楼 wosyingjun 2013-06-11  
yixiandave 写道
单线程的话可以用StringBuilder,速度更快。StringBuffer是线程安全的,所以线程保护方面浪费了效率

是的,StringBuilder在大部分情况下效率要比StringBuffer好,但在多线程中难以保证同步。
2 楼 yixiandave 2013-06-11  
单线程的话可以用StringBuilder,速度更快。StringBuffer是线程安全的,所以线程保护方面浪费了效率
1 楼 Flyaway_921 2013-06-11  
    楼主好人

相关推荐

Global site tag (gtag.js) - Google Analytics