理解:String与StringBuffer的区别

来源:互联网 发布:app 2g网络 编辑:程序博客网 时间:2024/05/22 01:55

String:

1、String不是基本数据类型,为对象是不可变的;
2、String类是final类型的,因此不可以继承这个类,一旦创建,就不能被修改这个值;
3、对存在的String对象进行改变的时候就等同于重新创建了一个新的String对象,然后将信值保存进去;
4、如果要经常改变字符串内容最好不用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,就会触发JVM的GC开始工作,运行速度就会显得比较慢。
5、String 实现了equals方法,newString(“abc”).equals(newString(“abc”)的结果为 true,而 StringBuffer 没有实现equals 方法,
所以,new StringBuffer(“abc”).equals(newStringBuffer(“abc”)的结果为false。

因为String 覆盖了equals方法和hashCode方法,而StringBuffer 没有覆盖 equals方法和hashCode 方法,所以,将StringBuffer 对象存储进 Java集合类中会出现问题。


StringBuffer:

1、StringBuffer类的值是可以进行修改的,是可变对象;
2、使用append()方法修改Stringbuffer的值,使用toString()方法转换为字符串。
3、StringBuffer通过构造函数来建立;注:不能通过赋值符号对它进行付值
4、StringBuffer是线程安全的,在多线程程序中很方便。


举例:

1、StringBuffer和String:

<span style="white-space:pre"></span>StringBuffer sb = new StringBuffer();long startTime = System.currentTimeMillis();for(int i = 0 ; i < 10000 ; i++){sb.append(i);}long endTime = System.currentTimeMillis();System.out.println("StringBuffer:"+(endTime-startTime)+"毫秒");
String str = new String();long startTime1 = System.currentTimeMillis();for(int i = 0 ; i < 10000 ; i++){str = str + i;}long endTime1 = System.currentTimeMillis();System.out.println("String:"+(endTime1-startTime1)+"毫秒");


运行结果:

从运行结果上可以看出字符串的连接StringBuffer的效率要比String高,但也有一些特殊情况。

2、特殊:

<span style="white-space:pre"></span>//第一种情况:<span style="white-space:pre"></span>long startTime2 = System.currentTimeMillis();String st = "This is only a" + "simple"+ "test";long endTime2 = System.currentTimeMillis();System.out.println("String:"+(endTime2-startTime2)+"毫秒\t"+st);long startTime3 = System.currentTimeMillis();StringBuffer sbf = new StringBuffer("This is only a").append("simple").append("test");long endTime3 = System.currentTimeMillis();System.out.println("StringBuffer:"+(endTime3-startTime3)+"毫秒\t"+sbf);
<span style="white-space:pre"></span>//第二种情况:long startTime4 = System.currentTimeMillis();String str1 = "This is only a";String str2 = "simple";String str3 = " test";String str4 = str1 + str2 +str3 ;long endTime4 = System.currentTimeMillis();System.out.println("String:"+(endTime4-startTime4)+"毫秒\t"+str4);


运行结果:


从运行结果来看,第一种情况生成String st 和生成StringBuffer sbf 速度几乎是一样的,而这个时候的StringBuffer一点也不占优势。

String st = "This is only a" + "simple"+ "test";//其实就是String st = "This is only a simple test ;//所以就不需要太多时间。

而第二种情况,字符串是来之不同的String对象的,在运行速度上就有一些区别。

1 0
原创粉丝点击