可变的String类StringBuffer类

String类是不可以被修改的,但是在程序设计中,很多情况需要字符串不断发生改变,此时如果还继续使用 String类,就会存在内存消耗大和效率低的问题,为此,Java还有另一种字符串的标准类StringBuffer类,StringBuffer类的对象是可以直接被修改的

String : 用于一般情况下;
StringBuffer : 用于多线程情况下: synchronized
StringBuilder :用于单线程

String和StringBuilder的使用方法:循环时用StringBuilder,因为不管循环多少次,都只会有一个StringBuilder对象,而用String是没循环一次就会产生一个新的StringBuilder对象。

//每次在循环内部都会产生一个StringBuilder的一个对象
    public static String fun1(String[] str){
        String str1 = "";
        for(int i = 0;i < str.length;i++){

            //str1 = str1+str[i];

            StringBuilder strbuffer = new StringBuilder(str1);
            strbuffer.append(str[i]);
            str1 = strbuffer.toString();
            /**
             * public String toString() {
                    return new String(value, 0, count);
                }
             */
        }
        return str1;

    }
public static String fun1(String[] str){
        //只生成一个StringBuilder对象
        StringBuilder str2 = new StringBuilder();
        for(int i = 0;i < str.length;i++){
            str2.append(str[i]);
        }
        return str2.toString();
    }

StringBuffer类的创建:

格式1:

StringBuffer 对象名 = null;
对象名 = new StringBuffer("字符串内容");

格式2:

StringBuffer 对象名 = new StringBuffer("字符串内容");

以上两种格式是等效的,创建StringBuffer对象不能像创建String对象那样直接赋值,这两种格式都包含了类名StringBuffer、new关键字及对象名和字符串的初始值。

StringBuffer类的常用方法:

1.String.intern();
native C++/c编写的
先去常量池里找是有当前字符串的引用,如果有返回该字符串在常量池当中的引用如果没有,创建一个引用。

public class LianXi {

    public static void main(String[] args) {
        String str4 = "abcd";
        String str5 = new String("ab")+new String("cd");
        String str6 = str5.intern();
        System.out.println(str4 == str6);
        System.out.println(str4 == str5);
        }
}

运行结果:

true
false

2.StringBuffer append() 和 StringBuffer insert()方法
追加内容

public class LianXi {

    public static void main(String[] args) {
        StringBuffer str2 = new StringBuffer("hello");
        str2.insert(3, "tulun");//3     下标  加在指定位置
        System.out.println(str2);
        str2.append("world");//append  新的对象   加在字符串后面
        System.out.println(str2);

        }
}

运行结果:

heltulunlo
heltulunloworld

3.indexOf()
从头开始搜索指定子字符串的位置,如果子字符串存在就返回子字符串的位置,不存在就返回-1;

public class LianXi {

    public static void main(String[] args) {
        String pwd = "abccdefg";
        String lzq = "cde";
        System.out.println(pwd.indexOf(lzq));
        String pop = "fer";
        System.out.println(pwd.indexOf(pop));
        }
}
3
-1

4.substring()
可以根据指定索引点截取字符串

public class LianXi {

    public static void main(String[] args) {
        String pwd = "java是面向对象的编程语言";
        System.out.println("截取"+pwd+",从10号下标开始截取的子字符串:"+pwd.substring(10));
        System.out.println("截取"+pwd+",从5~9号下标截取的子字符串:"+pwd.substring(5,9));
        }
}

运行结果:

截取java是面向对象的编程语言,从10号下标开始截取的子字符串:编程语言
截取java是面向对象的编程语言,从5~9号下标截取的子字符串:面向对象

5.charAt()
实现从字符串中提取指定位置的字符

public class LianXi {

    public static void main(String[] args) {
        String pwd = "java是面向对象的编程语言";
        char lzq = pwd.charAt(9);
        System.out.println(pwd+"第9索引位置的元素是"+lzq);
    }
}

运行结果:

java是面向对象的编程语言第9索引位置的元素是的

猜你喜欢

转载自blog.csdn.net/qq2899349953/article/details/80530272