zoukankan      html  css  js  c++  java
  • StringBuffer类 和 StringBuilder类

    上一篇中讲解了String类的用法。那么String有什么特点呢?

    字符串特点:字符串是常量,其值在创建后就不能被修改。字符串的内容一旦发生变化,就会创建一个新的对象。

    代码验证字符串特点:

    1 public class Demo1 {
    2     
    3     public static void main(String[] args) {
    4         String str1 = "hello";
    5         String str2    = str1+" world";
    6         System.out.println("str1与str2是同一个 对象吗?"+(str1==str2));
    7     }
    8 }
    View Code

    因此,字符串的内容不适宜频繁修改,为了解决此问题就出现了StringBuffer类和StringBuilder类。

    StringBuffer

    StringBuffer 其实就是一个存储字符的容器。StringBuffer 底层是依赖了一个字符数组才能存储字符数据 的,该字符串数组默认 的初始容量是16, 如果字符数组的长度不够使用 时,自动增长1倍+2。

    容器具备的行为:增删改查。

    具体的方法可以参照api。

    1、增加(存储)

       StringBuffer append():将指定的数据作为参数添加到已有数据结尾处(除了byte和short类型的数据没有以外其他数据类型都有都可以)

       StringBuffer insert(index,数据):可以将数据插入到指定index位置

    代码示例如下: 

     1 public static void stringBuffer_add(){
     2         StringBuffer sb = new StringBuffer();
     3         sb.append("abc").append(true).append(5378);//方法调用链结果是一串字符串
     4         StringBuffer sb1 = sb.append(34563);
     5        //结果是true  sb和sb1指向同一个对象,这叫做面盆理论,不管往StringBuffer这个容器里加什么结果还是这个容器
     6         System.out.println("sb==sb1:"+(sb==sb1));
     7           //指定位置添加元素
     8         StringBuffer sb2=sb1.insert(3,"hello");
     9         System.out.println(sb2.toString());
    10      }
    View Code

    2、删除

       StringBuffer delete(start,end)     删除缓冲区中的数据,包含start,不包含end,如果start超过角标的话,会抛出异常字符串角标越界
      StringBuffer deleteCharAt(index)   删除指定位置的字符 

    代码示例如下: 

     1 public static void stringBuffer_del(){
     2         StringBuffer sb = new StringBuffer("haohaoxuexi,tiantianxiangshang");
     3         System.out.println(sb.toString());
     4 
     5         //删除某一部分
     6         sb.delete(1,3);
     7         System.out.println(sb.toString());
     8 
     9         //删除字符串中的某一个元素
    10         sb.delete(2,3);
    11         sb.deleteCharAt(2);
    12         System.out.println(sb.toString());
    13         //清空缓冲区
    14         sb.delete(0,sb.length());
    15         System.out.println(sb.toString());
    16     }
    View Code

    3、修改

      StringBuffer replace(start,end,string); 替换指定位置的字符串
      void setCharAt(int index,char ch); 只可以替换某一个字符

    代码示例:

    1 public static void stringBuffer_Update(){
    2         StringBuffer sb1 = new StringBuffer("javascript");
    3         StringBuffer sb2 = sb1.replace(4,10,"ee");
    4         System.out.println(sb2);
    5         sb1.setCharAt(1,'j');
    6         System.out.println(sb1);
    7     }
    View Code

    4、查看

      char charAt(int index) 获取指定索引的字符
      int indexOf(String str) 查找第一次出现字符串的索引
      int lastIndexOf(String str) 查找最后一次出现字符串的索引
      int length() 返回StringBuffer的长度
      String substring(int start , int end) 截取StringBuffer

    代码示例:

    1 public static void stringBuffer_read(){
    2         StringBuffer sb = new StringBuffer("javascript");
    3         char ch = sb.charAt(3);
    4         int index1 = sb.indexOf("sc");
    5         int index2 = sb.lastIndexOf("sc");
    6         int len = sb.length();
    7         String str = sb.substring(5,7);
    8         System.out.println("ch="+ch+",index1="+index1+",index2="+index2+",len="+len+",str="+str);
    9     }
    View Code

    5、其他方法

      StringBuffer reverse(); 反转 

      setLength();设置StringBuffer容器的长度  

      void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin);将缓冲区中指定数据存储到指定字符数组中

    代码示例:

     1 public static void stringBuffer_Other() {
     2          StringBuffer sb = new StringBuffer();
     3           //设置长度
     4           sb.setLength(4);
     5           System.out.println(sb.length());
     6 
     7           //将字符串反转
     8           StringBuffer sb1 = new StringBuffer("java");
     9           sb1 = sb1.reverse();
    10          System.out.println(sb1);
    11         //  将缓冲区中指定数据存储到指定字符数组中
    12         char[] arr = new char[15];
    13         StringBuffer sb2 = new StringBuffer("haohaoxuexi");
    14         sb2.getChars(0, 7, arr, 3);
    15         for(char c : arr){
    16             System.out.print(c);
    17         }
    18     }
    View Code

    StringBuilder

    JDK1.5版本之后出现了StringBuilder,StringBuilder几乎和StringBuffer中的方法完全一样。

    StringBuffer和StringBuilder的相同和不同点:

    相同点:

      1、两个类都是字符串缓冲类。

      2、两个类的方法都是一致的。

    不同点:

      1、StringBuffer是线程安全的,操作效率低;StringBuilder是线程非安全的,操作效率高。

      2、StringBuffer是jdk1.0的时候出现的,StringBuilder是jdk1.5的时候出现的。

    推荐使用:StringBuilder,因为其效率高。而且在现实开发中很少出现多线程情况下对同一字符串操作,所以这种操作可以忽略。

  • 相关阅读:
    18.中介者模式
    17.迭代器模式
    16.解释器模式
    15.命令模式
    Git超详细用法,通俗易懂
    CSS Sprites精灵图(雪碧图)
    小程序被冻结,忘记原始ID,如何找回?
    vue组件-视频播放之video.js
    基础设计模式-04 复杂对象创建的建造器模式
    基础设计模式-03 从过滤器(Filter)校验链学习职责链模式
  • 原文地址:https://www.cnblogs.com/nicker/p/6204508.html
Copyright © 2011-2022 走看看