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对象的,在运行速度上就有一些区别。