• 字符串缓冲区和字符串构造器


    一、字符串缓冲区

    1.简介:StringBuffer字符串缓冲区,与字符串String不同的是StringBuffer创建后仍能修改,而String创建之后就不能修改。

        String s1="123";
        StringBuffer s2=new StringBuffer("123");
        System.out.println(s1.hashCode()+" "+s2.hashCode());
        s1+="456";
        s2.append("456");
        System.out.println(s1.hashCode()+" "+s2.hashCode());

    48690 118352462
    1450575459 118352462输出结果可以说明String对象已经发生变化,StringBuffer没有变化。

    其机制是预先申请缓冲区来存储,当存储长度超过缓冲区大小就重新申请新的缓冲区。缓冲区的大小就称作字符串缓冲区的容量,而其中存储的字符个数称为字符串缓冲区的长度。

    2.创建

    构造方法 长度 容量
    public StringBuffer() 0 16
    public StringBuffer(int capacity) 0 capacity
    public StringBuffer(String str) str.length() str.length()+16

    3.操作方法

    (1)获得长度 int length().

    获得容量 int capacity().

    设置容量void ensureCapacity(int minCapacity),若minCapacity小于现有的缓冲区的容量,那么这个方法不起作用,否则就要改变现有的容量,将会是minCapacity和(当前容量)*2+2两个数中较大的一个。

    void trimToSize()将容量缩小至与长度相同。

    设置长度 void setLength(int newLength),其中参数newLength应该大于等于0,若newLength与现在长度相同,则字符串缓冲区不发生变化;若newLength小于当前长度,则字符串缓冲区只保留前newLength个字符;若newLength大于当前长度,则在后面补上字符'u0000',其中如果大于容量,需要增加容量,新的容量是newLength与(当前容量)*2+2两个数中较大的一个。

    (2)查询字符char charAt(int index)获取第index+1个字符。

    设置字符void setCharAt(int index,char ch)将下标为index,第index+1个字符设置为字符ch。

    int indexOf(String str)和int indexOf(String str,int fromIndex)、int lastIndexOf(String str)和int lastIndexOf(String str,int fromIndex)情况与字符串完全相同,详情见上篇,但是StringBuffer没有查找参数为字符的情况,只有字符串的情况。

    (3)增插删替 这些方法也是主要区别于String的地方,这些方法不用一个新的StringBuffer接受返回值也可,直接调用例如sb.reverse(),字符串缓冲区对象已经发生改变,sb成为倒序。(可有可无)

    增加到末尾方法StringBuffer append(Object obj)其实参数几乎可以是任何类型的参数,将其对应的字符串加到字符串缓冲区的末尾,参数需要转化为字符串,转换方法也在上一篇有详细说明。

    插入方法StringBuffer insert(int offset,Object obj)第二个参数与append方法参数性质相同,作用在第offset个字符后面插入子符串,例如:

        StringBuffer sb=new StringBuffer("123456");
        StringBuffer sb2=new StringBuffer("000000");
        sb.insert(0, sb2);
        System.out.println(sb);           //输出000000123456

    如果插入字符串后的新长度大于当前容量,则新容量变为现在长度与(当前容量)*2+2两个数中较大的一个。

    删除包括删除一段字符串或一个字符。StringBuffer delete(int start,int end)删除下标从start到end-1中的字符序列。StringBuffer deleteCharAt(int index)删除下标为index的字符。

    替换StringBuffer replace(int start,int end,String str)指将下标从start到end-1之间的字符串替换为str,若start==end,就变为在与insert(start,str)相同的效果。

        StringBuffer sb=new StringBuffer("123456");
        String s2="&&&";
        sb.replace(2, 4, s2);      //参数只能是Stirng,不能是StringBuffer
        System.out.println(sb);

    输出12&&&56             容量的设置上还是老办法。

    (4)其他方法

    逆序排列现有字符串 StringBuffer reverse()

    转换为String对象 String toString()

    获取子字符串 String substring(int start)和String substring(int start,int end) 取下标start到末尾的字符串以及下标从start到end-1的字符串

    二、字符串构造器StringBuilder

    基本上与StringBuffer是一样的,于是字符串缓冲区又多了一种构造方法(你懂的)。唯一的区别就是StringBuilder是线程不安全的,那就到线程时间在说吧。除此之外可能在大部分情况下对于速度来说有:StringBuilder>StringBuffer>String

  • 相关阅读:
    《PHP程序员面试笔试宝典》——如何回答非技术性问题?
    《PHP程序员面试笔试宝典》——如何回答技术性的问题?
    《PHP程序员面试笔试宝典》——如何巧妙地回答面试官的问题?
    我的新书——《PHP程序员面试笔试宝典》
    小程序"errcode":41002错误问题如何解决?
    Apache虚拟主机的搭建及相关问题解决
    PHP面试题详解
    Mysql的基本操作知识
    图片压缩
    JS点击复制
  • 原文地址:https://www.cnblogs.com/lbrs/p/9034001.html
Copyright © 2020-2023  润新知