likes
comments
collection
share

java常用API-String、StringBuilder、StringBuffer

作者站长头像
站长
· 阅读数 39

java常用API-String、StringBuilder、StringBuffer

StringBuilder

StringBuilder代表可变字符串对象,相当于是一个容器,它里面装的字符串是可以改变的,就是用来操作字符串的

好处: StringBuilder比String更适合做字符串的修改操作,效率会更高,代码也会更简洁。

构造方法:

构造器说明
public StringBuilder()创建一个空白的可变的字符串对象,不包含任何内容
public StringBuilder(String str)创建一个指定字符串内容的可变字符串对象

常用方法:

append:在字符串末尾添加内容(可以是任意类型) insert:在指定位置插入内容 delete:删除指定位置的字符 deleteCharAt:删除指定位置的字符 replace:替换指定位置的字符 substring:截取子串 indexOf:查找指定字符串位置 lastIndexOf:查找最后一次出现的指定字符串位置 length:获取当前字符串长度 setLength:设置字符串长度

toString : 可以把StringBuilder转换为String

reverse:反转字符串

常用方法的基本使用:

public class StringDemo {
    public static void main(String[] args) {
        //StringBuilder
        StringBuilder strbu=new StringBuilder("你好");
        System.out.println(strbu);
        //增
        strbu.append("java修炼手册").append(19).append(90);
        System.out.println(strbu);  //你好java修炼手册1990
        System.out.println(strbu.reverse()); //反转字符串
        //0991册手炼修avaj好你

        //删除
        strbu.delete(1,2); // 删除序号1-2的字符串,但是不包括2
        System.out.println(strbu); //091册手炼修avaj好你

        // 改 replace
        strbu.replace(0,1,"2020");
        System.out.println(strbu); //202091册手炼修avaj好你

        //获取长度
        System.out.println(strbu.length());//16

        //转换为一个字符串
        String s = strbu.toString();
        System.out.println(s);//202091册手炼修avaj好你

        //插入insert
        strbu.insert(0,88); //插入位置,插入的数据
        System.out.println(strbu);//88202091册手炼修avaj好你

        //查找indexOf
        System.out.println(strbu.indexOf("手")); //9
    }
}

为啥要用StringBuilder?

对于字符串相关的操作,如频繁的拼接、修改等,建议用StringBuidler,效率更高!

注意: 如果操作字符串较少,或者不需要操作,以及定义字符串变量,还是建议用String。

  StringBuilder sb=new StringBuilder();
        for (int i = 0; i < 100000; i++) { //运行速度比以往的String的速度快很多倍
            sb.append(i);
        }
        System.out.println(sb);

StringBuffer

注意:

  • StringBuffer的用法与StringBuilder是一模一样的
  • 但stringBuilder是线程不安全的,StringBuffer是线程安全的

案例:返回任意整型数组的内容

public class StringDemo {
    public static void main(String[] args) {   
        //返回任意整形数组的内容
        int[] arr={23,54,675,7,5,2,4,6,432};
        String arrayData = getArrayData(arr);
        System.out.println(arrayData);//[23,54,675,7,5,2,4,6,432]
    }

public static String getArrayData(int[] arr){
    if(arr==null){
        return null;
    }
    StringBuffer stringBuffer=new StringBuffer();
    stringBuffer.append('[');
    for (int i = 0; i <arr.length ; i++) {
        if(i==arr.length-1){
            //增加判断如果是最后一个元素了就不要添加逗号了
            stringBuffer.append(arr[i]);
            break;
        }
        stringBuffer.append(arr[i]).append(','); //就这样会多一个逗号

    }
    stringBuffer.append(']');
    return stringBuffer.toString();

}
}

StringJoiner

可以实现高效快捷的拼接

JDK8开始才有的,跟StringBuilder一样,也是用来操作字符串的, 也可以看成是一个容器,创建之后里面的内容是可变的

好处:不仅能提高字符串的操作效率,并且在有些场景下使用它操作字符串,代码会更简洁

构造器说明
public stringJoiner(间隔符号)创建一个stringJoiner对象,指定拼接时的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)创建一个stringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号

常用方法:

方法名称说明
public stringJoiner add(添如的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public string tostring()返回一个字符串(该字符串就是拼接之后的结果)

用StringJoiner实现返回任意整型数组的内容:

 public static String getStringJoiner(int[] arr){
        if(arr==null){
            return null;
        }
        //创建对象,分别指定分隔符,开始符号,结束符号
        StringJoiner strjoin=new StringJoiner(",","[","]");
        for (int i = 0; i <arr.length ; i++) {
            //里面不可以直接放一个数字啥的,只可以放CharSequence 字符序列
//            strjoin.add(arr[i])
           strjoin.add(String.valueOf(arr[i]));
        }
        return strjoin.toString();
    }

相比较前面的StringBuffer 实现的代码更加简洁,并且运算速度更快一些

需要注意:StringJoiner 在add的时候里面需要放入CharSequence 字符序列,是数字啥的都是不可以的

CharSequence类

CharSequence类是java.lang包下的一个接口,此接口对多种不同的对char访问的统一接口,像String、StringBuffer、StringBuilder类都是CharSequence的子接口;

CharSequence类和String类都可以定义字符串,但是String定义的字符串只能读,CharSequence定义的字符串是可读可写的

String、String StringBuffer 和 StringBuilder 的区别是什么?

String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成新的String对象。

private final char value[];

每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法 拼接+后面的字符。

StringBuffer和StringBuilder他们两都继承了AbstractStringBuilder抽象类,从

AbstractStringBuilder抽象类中我们可以看到

/**
* The value is used for character storage.
*/
char[] value;

他们的底层都是可变的字符数组,所以在进行频繁的字符串操作时,建议使用StringBuffer和

StringBuilder来进行操作。 另外StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所

以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

StringBuffer对方法都添加了同步锁

@Override
    public synchronized int length() {
        return count;
    }
转载自:https://juejin.cn/post/7286871715501981751
评论
请登录