StringBuilder及链式操作原理

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类大量拼接字符串时产生过多中间对象的提供的一个类。

StringBufferStringBuilder之间最大的不同在于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的链式操作

上面对StringBufferStringBuilder的.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、由于去掉了线程安全保护的功能,所以StringBuilderStringBuffer拼接效率更高;

3、StringBuilder可以支持链式操作,当然StringBuffer也可以;

你可能感兴趣的:(Java基础)