String类
string类是java的基础类之一。
虽然可以用来拼接字符串,但是,效率并不高,原因是在每次进行拼接的时候都会产生对象,导致在操作过后产生许多无用的中间对象,如果频繁操作不仅浪费内存还会影响效率。
以下是String拼接方式
String s = "hello";
for (int i = -1;i < 6;i++)
s = s + "," + i;
System.out.println(s);
//结果 hello,-1,0,1,2,3,4,5
StringBuffer类与StringBuilder类
StringBuffer
是为了解决String
类大量拼接字符串时产生过多中间对象的提供的一个类。
StringBuffer
与StringBuilder
之间最大的不同在于StringBuffer
是线程安全的而StringBuilder
不是,其他方面二者几乎一模一样,由于StringBuilder
不执行同步所以StringBuilder
更快。在多数情况下使用StringBuilder
更合适因为其效率更高,若要考虑线性安全问题则应使用StringBuffer
。
以下是StringBuffer
拼接方式
StringBuffer stringBuffer = new StringBuffer("Hello");
stringBuffer.append(" World")
.append("!");
System.out.println(stringBuffer);
//结果 Hello World!
以下是StringBuilder
拼接方式
StringBuilder stringBuilder = new StringBuilder(1024);//链式操作 1024位容量值
stringBuilder.append("Mr")
.append(".")
.append("Yuan")
.insert(0,"Hello!");//在0位置插入Hello
System.out.println(stringBuilder);
//结果 Hello!Mr.Yuan
StringBuilder的链式操作
上面对StringBuffer
和StringBuilder
的.append()
操作就是一种链式操作,类似于c语言链表结构体中的 Node->next = otherNode
或者是C++ STL库中的Lists类的push_back()
.
进行链式操作的关键是,定义append()
方法或返回this
,这样就可以不断调用自身的其他方法实现链式操作。
以下是利用这个原理实现 游戏中的建造建筑功能
public class creatBuilders {
private StringBuilder builder = new StringBuilder(1024);
/**
* 创建建筑物
* @param build
* @return this
*/
public creatBuilders createBuilding(String build){
builder.append(build+" ");
return this;
}
/**
* 删除最新创建的建筑物
* @return this
*/
public creatBuilders deleteLastBuilder(){
while (1 == 1)
{
builder.deleteCharAt(builder.length()-1);//删除字符
//判断" "是否与字符串中的某字符相同时停止删除
if(builder.charAt((int)(builder.length()-1)) == ' '){
builder.deleteCharAt(builder.length()-1);//继续删除这一个空格以免影响下次操作
break;
}
}
return this;
}
/**
* 删除指定的建筑
* @param name
* @return
*/
public creatBuilders deleteBuilder(String name){
int index = builder.indexOf(name);
builder.delete(index,index+name.length()+1);
return this;
}
/**
* 返回所有建筑物
* @return String
*/
public String getAllBuilder(){
return builder.toString();
}
}
public class Main {
public static void main(String[] args) {
creatBuilders cb = new creatBuilders();
cb.createBuilding("草屋")
.createBuilding("城楼")
.createBuilding("马庐")
.createBuilding("炮楼")
.createBuilding("粮草营");
System.out.println(cb.getAllBuilder());
//删除最新创建的建筑
cb.deleteLastBuilder();
System.out.println(cb.getAllBuilder());
//删除建筑
cb.deleteBuilder("马庐");
System.out.println(cb.getAllBuilder());
}
}
/*
结果
草屋 城楼 马庐 炮楼 粮草营
草屋 城楼 马庐 炮楼
草屋 城楼 炮楼
*/
总结
1、StringBuilder
是可变对象,能够用来高效拼接;
2、由于去掉了线程安全保护的功能,所以StringBuilder
比StringBuffer
拼接效率更高;
3、StringBuilder
可以支持链式操作,当然StringBuffer也可以;