String 和 StringBuffer 的区别(及StringBuffer的常用方法)

String 和 StringBuffer 的区别(及StringBuffer的常用方法)

对比

String StringBuffer
对象是否可变 String创建的对象是不可变的,一旦创建不可改变 StringBuffer创建的对象是可变的
值改变存储过程 对象值的改变是创建了一个新的对象,然后把新的值保存进去 值不是重新创建对象,而是通过构造方法
对象存储位置 String创建的对象存储在常量池,不用的时候不会被销毁 StringBuffer创建的对象的值存在于栈区,不用的时候会被销毁
运行效率 运行时间较长 运行时间较短
适用范围 比较短而小的字符串 比较长的字符串,比较多的字符串
其他 被final修饰,不可以被继承

image

二者速度对比

public class test2 {
    public static void main(String[] args) {
        //1. String值改变测试
        String str = "";
        long stringFirst = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            str = str + i;
        }
        long stringEnd = System.currentTimeMillis();
        System.out.println("String值改变测试 , 时间:" + (stringEnd - stringFirst) + "ms");

        //2. StringBuffer值改变测试
        StringBuffer str2 = new StringBuffer();
        long stringBufferFirst = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            str2.append(i);
        }
        long stringBufferEnd = System.currentTimeMillis();
        System.out.println("StringBuffer值改变测试 , 时间:" + (stringBufferEnd - stringBufferFirst) + "ms");

    }
}

image

结果显而易见,StringBuffer比String性能强太多了

StringBuffer的常用方法

构造函数

StringBuffer() value内容为空,并设置容量为16个字节;
StringBuffer(CharSequece seq)  使用seq初始化,容量在此基础上加16;
StringBuffer(int capacity) 设置特定容量;
StringBuffer(String str)  使用str初始化,容量str大小的基础上加16;

append方法

由于继承了Appendable接口,所以要实现append方法,StringBuffer类对几乎所有的基本类型都重载了append方法:

append(boolean b)
append(char c)
append(char[] str)
append(char[] str,int offset,int len)
append(CharSequence s)
append(CharSequence s,int start,int end)
append(double d)
append(float f)
append(int i)
append(long lng)
append(Object obj)
append(String str)
append(StringBuffer sb)

insert方法

insert方法可以控制插入的起始位置,也几乎对所有的基本类型都重载了insert方法:

insert(int offser,boolean b)
insert(int offset,char c)
insert(int offset,char[] str)
insert(int index,char[] str,int offset,int len)
insert(int dsfOffset,CharSequence s)
insert(int dsfOffset,CharSequence s,int start,int end)
insert(int offset,double d)
insert(int offset,float f)
insert(int offset,int i)
insert(int offset,long l)
insert(int offset,Object obj)
insert(int offset,String str)

其它会改变内容的方法

上面的那些方法会增加StringBuffer的内容,还有一些方法可以改变StringBuffer的内容:

StringBuffer delete(int start,int end) 删除从start到end(不包含)之间的内容;
StringBuffer deleteCharAt(int index) 删除index位置的字符;
StringBuffer replace(int start,int end,String str) 用str中的字符替换value中从start到end位置的子序列;
StringBuffer reverse() 反转;
void setCharAt(int index,char ch) 使用ch替换位置index处的字符;
void setLength(int newLength) 可能会改变内容(添加'\0');

其它常用方法

下面这些方法不会改变内容:

int capacity() 返回value的大小即容量;
int length() 返回内容的大小,即count;
char charAt(int index) 返回位置index处的字符;
void ensureCapacity(int minimumCapacity) 确保容量至少是minimumCapacity;
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin) 返回srcBegin到srcEnd的字符到dst;
int indexOf(String str) 返回str第一次出现的位置;
int indexOf(String str,int fromIndex) 返回从fromIndex开始str第一次出现的位置;
int lastIndexOf(String str) 返回str最后出现的位置;
int lastIndexOf(String str,int fromIndex) 返回从fromIndex开始最后一次出现str的位置;
CharSequence subSequence(int start,int end) 返回字符子序列;
String substring(int start) 返回子串;
String substring(int start,int end) 返回子串;
String toString() 返回value形成的字符串;
void trimToSize() 缩小value的容量到真实内容大小;
posted @ 2022-09-22 17:03  DevourZuan  阅读(53)  评论(0编辑  收藏  举报