• StringBuffer


      1.概述

    StringBuffer类和String类一样,代表字符串,由于StringBuffer的内部实现方式和String不同,在进行字符串处理时,不生成新的对象,所以在内存使用上要优于String类。因此,在实际使用时,如果经常需要对一个字符串进行修改(插入、删除)等操作,使用StringBuffer要更加适合。StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的,但是StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。另外StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

    2.初始化

    Java对StringBuffer对象的初始化提供了和String不同的语法,通常使用构造方法进行初始化。

    错误的方式:

    1 StringBuffer sb="jfl";    //不能将String类型的字符串赋给StringBuffer对象

    正确的方式:

    1 StringBuffer sb=new StringBuffer();
    2 
    3 StringBuffer sb=new StringBuffer("jfl");

    3.类型转换

    StringBuffer和String虽然都代表字符串,但是属于不同的类型,强制转换时需要注意以下几点:

    错误的方式:

    1 StringBuffer sb=(StringBuffer) "jfl";   //两者无父子关系,无法强转

    正确的方式:

    1 String s="jfl";
    2 
    3 StringBuffer sb=new StringBuffer("abc");
    4 
    5 String s1=sb.toString   //StringBu转为String
    6 
    7 StringBuffer sb1=new StringBuffer(s);   //String转为StringBuffer

    4.方法

    StringBuffer 上的主要操作是 appendinsert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而insert方法则在指定的点添加字符。

    4.1 append(A a)

    其中A指boolean,char,char[],double,float,int,long,String,Object,CharSequence等类型,append 方法始终将这些字符添加到缓冲区的末端.

    1 StringBuffer sb=new StringBuffer("jfl");
    2 
    3 sb.append("123");         //结果变为"jfl123"

    4.2 char charAt(int index)

    返回此序列中指定索引处的 char 值,该序列的索引和数组相同,从0开始。

    1 StringBuffer sb=new StringBuffer("jfl");
    2 
    3 System.out.println(sb.charAt(2));   //输出'f'

    4.3 delete(int start, int end)

    移除此序列的子字符串中的字符;其中,区间为[start,end)。

    1 StringBuffer sb=new StringBuffer("Iamjfl");
    2 
    3 sb.delete(1,3);  
    4 
    5 System.out.println(sb);   //输出"Ijfl"

    4.4 deleteCharAt(int index) 

    移除此序列指定位置的char

    1 StringBuffer sb=new StringBuffer("jfl");
    2 
    3 sb.delete(1); 
    4 
    5 System.out.println(sb);   //输出"jl"

    4.5 int indexOf(String str, int fromIndex)

    从指定的索引处开始,返回第一次出现的指定子字符串在该字符串中的索引。相对简单的有indexOf(String str),返回第一次出现的指定子字符串在该字符串中的索引。

    1 StringBuffer sb=new StringBuffer("jfljfl");
    2 
    3 int i=sb.indexOf("f",2);
    4 
    5 System.out.println(i);   //输出4

    4.6 insert(int offset, A a)

     其中A指boolean,char,char[],double,float,int,long,String,Object,CharSequence等类型 , 将 A 参数的字符串表示形式插入此序列中

    1 StringBuffer sb=new StringBuffer("jfl");
    2 
    3 sb.insert(1,"123");
    4 
    5 System.out.println(sb);     //输出"j123fl"

     4.7  reverse()

    将此字符序列用其反转形式取代

    1 StringBuffer sb=new StringBuffer("jfl");
    2 
    3 System.out.println(sb.reverse());      //输出"lfj"

    4.8 void setCharAt(int index, char ch)

    将给定索引处的字符设置为 ch

    1 StringBuffer sb=new StringBuffer("jfl");
    2 
    3 sb.setCharAt(1,'j');
    4 
    5 System.out.println(sb);    //输出"jjl"

    4.9 String toString()

    返回此序列中数据的字符串表示形式,即上述的强制转换,将StringBuffer转为String。

    注:StringBuffer中还有许多方法没有列出,详情请查询api文件。

    5.效率

    通过以下测试可知,当字符串长度越长时,对StringBuffer类字符串的操作用时远比String 类型少。

    public  class TestStringBuffer {   
    
        public static void main(String[] args){      
    
           String str = "abcde";      
    
           int count = 10000;
    
           // 通过String对像
    
           long timeStart1 = System.currentTimeMillis();
    
           String str1 = "";
    
           for (int i=0; i<count; i++) {
    
            str1 += str;
    
             }
    
             long timeEnd1 = System.currentTimeMillis();
    
            System.out.println("String: " + (timeEnd1 - timeStart1) + "ms");
    
            // 通过StringBuffer对象
    
            long timeStart2 = System.currentTimeMillis();
    
            StringBuffer str2 = new StringBuffer();
    
            for (int i=0; i<count; i++) {
    
            str2.append(str);
    
            }
    
            long timeEnd2 = System.currentTimeMillis();
    
           System.out.println("StringBuffer: " + (timeEnd2 - timeStart2) + "ms");
    
            }             
    
    }  

    6.StringBuilder类

    StringBuilder类和StringBuffer类相类似,区别在于StringBuffer类是多线程安全的,而StringBuilder不是线程安全的。StringBuffer、StringBuilder、String中都实现了CharSequence接口。它们对CharSequence接口的实现方式如下图:

     

  • 相关阅读:
    angular2监听页面大小变化
    angular如何引入公共JS
    angular使用Md5加密
    angular4模块中标签添加背景图
    angular使用sass的scss语法
    设置angular公共样式表
    更改angular的默认端口
    angular模拟web API
    RN与webview通讯
    shell通过ping检测整个网段IP的网络状态脚本
  • 原文地址:https://www.cnblogs.com/jfl-xx/p/4779409.html
Copyright © 2020-2023  润新知