一.StringBuilder类和StringBuffer类
在第九节中我们讲过,String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个这个对象被销毁。简单的说,就是String是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的String对象,然后将指针指向了新的String对象,所以经常改变内容的字符串最好不要用String,因为每次产生对象时都会对系统的性能产生影响,特别是当内存中无引用对象多了以后,JVM的GC就开始工作,那速度是一定会相当慢的。
而StringBuffer和StringBuilder就不一样啦,StringBuffer对象代表一个字符序列可变的字符串,当一个StringBuffer被创建后,通过StringBuffer提供的方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
StringBuffer类创建的字符串每次都会对StringBuffer对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下都推荐使用StringBuffer,特别是字符串经常改变的情况下。而在某些情况下,String对象的字符串拼接其实是被JVM解释成了StringBuffer对象的拼接,所以这些时候String对象的速度并不会比StringBuffer对象慢,而特别是以下的字符串对象生成中,String效率是要远比StringBuffer快的:
例1:
String S1 ="This is a"+"fine"+"day";
StringBuffer Sb = new StringBuffer("This is a").append("fine").append("day");
在这个例子中,String创建的对象S1的速度要远远快于StringBuffer创建的对象Sb,这是因为这个String创建时连结的字符串都是常量字符串,所以是对于指向同一个字符串所进行的改变,如果String S1连接的是另一个字符串变量的话,速度就没有这么快了。
StringBuilder类也代表了字符串对象,实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法基本相同。所不同的是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。因此在一般情况下,StringBuilder>StringBuffer>String;
下面的例子创建了一个StringBuilder对象:
例2:
public class HelloWorld {
public static void main(String[] args) {
//创建一个空的StringBuilder对象
StringBuilder str1=new StringBuilder();
// 创建一个StringBuilder对象,用来存储字符串
StringBuilder str2=new StringBuilder("爱JAVA");
System.out.println(str2);
}
}
二.StringBuilder类的常用方法
StringBuilder类提供了许多方法,具体参照API,这里只列出四种比较重要的:
append(参数) 追加内容到当前StringBuilder对象的末尾;
insert(位置,参数) 将内容插入到StringBuilder对象的指定位置;
toString() 将StringBuilder对象转换为String对象
length() 获取字符串的长度
下面的例3中,创建了StringBuilder对象,用来存储字符串,并对其做了追加和插入操作。这些操作修改了str对象的值,而没有创建新的对象,这就是StringBuilder和String最大的区别:
例3:
public class HelloWorld {
public static void main(String[] args) {
// 创建一个StringBuilder对象,用来存储字符串
StringBuilder str=new StringBuilder("Hello");
str.append("world");//在字符串后面追加字符串
str.append(1111);//在字符串后面追加整数
System.out.println("字符串长度:"+str.length());//字符串长度
System.out.println("插入前: "+str);
str.insert(10,"!");//在指定位置插入内容
String str2 = str.toString();//转换为String对象
System.out.println("插入后:"+str2);
}
}
运行结果为:
字符串长度:14
插入前: Helloworld1111
插入后:Helloworld!1111
最后再通过例4的练习来加深对StringBuffer和StringBuilder的理解:
例4:将一个由数字组成的字符串转换成指定格式--从右边开始每三个字母用逗号分隔的形式。
public class HelloWorld {
public static void main(String[] args) {
// 创建一个空的StringBuilder对象
StringBuilder str = new StringBuilder();
// 追加字符串
str.append("0123456");
System.out.println("原来4在字符串中的位置:"+str.indexOf("4"));
System.out.println("原来字符串的长度:"+str.length());
// 从后往前每隔三位插入逗号
for(int i = str.length()-3; i>0; i=i-3){
str.insert(i,',');//第一次进行插入时,由于字符串中无此位置,不给予插入
}
System.out.println("插入后4在字符串中的位置:"+str.indexOf("4"));
System.out.println("现在的字符串长度"+str.length());
// 将StringBuilder对象转换为String对象并输出
System.out.print(str.toString());
}
}
运行结果:
原来4在字符串中的位置:4
原来字符串的长度:7
插入后4在字符串中的位置:6
现在的字符串长度9
0,123,456
至此,String类结束,其他Date类等明天总结,该高数时间了,明天见~