StringBuilder / StringBuffer类

Posted penguin1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StringBuilder / StringBuffer类相关的知识,希望对你有一定的参考价值。

StringBuilder类 和 StringBuffer 类的由来?    

   在Java中使用String 类可以描述所有的字符串数据,但是String类的对象一旦创建,则该对象的字符序列 就不可更改,当需要更改字符串内容时,需要拷贝出来多个副本单独进行保存,因此对空间 和 时间 的消耗会比较大。

而StringBuilder类 和 StringBuffer 类 ,这两个类描述的字符序列可以直接更改。可以使用StringBuilder类 和 StringBuffer 类,来解决这样的问题

 

StringBuilder类 和 StringBuffer 类的比较?

    StringBuffer类早期存在的类,  支持线程同步/安全,  因此效率比较低

    StringBuilder类后来增加的类不支持线程同步/安全,因此效率比较高

 

 

 


 

 一、StringBuilder类

1. 概述

   java.lang.String 类由 final 修饰,表示该类不能被继承。

  该类用于描述 可变的字符序列 , 不支持线程的同步 / 安全,因此效率比较高。

 

2. 常用方法

                       StringBuilder()                             -使用无参的形式进行对象的构造,初始容量是16个字符。

                      StringBuilder(String  str)              -容量为16 + 字符串的长度

                      StringBuilder(int capacity          - 根据参数指定的容量来构造该类的对象

              int     capacity()                 -返回调用对象的容量

              int      length()                   -返回调用对象中字符的个数

StringBuilder   insert( int  offset, String str )                   -用于将str 插入 到当前调用对象中 下标为offset的索引位置上,

StringBuilder  append( String str )                                 -用于将str指向的字符串内容 追加 到当前字符串的末尾。

StringBuilder  delete( int startint end                        -用于 删除 字符串中  [start, end) 区间的子字符串内容

StringBuilder  replace (int start,  int end, String str )     -用于将当前字符串中  下标为[start, end) 区间的字符串内容 替换 成str

StringBuilder  reverse() -用于 反转字符序列

 

代码:

package com.monkey1038;

public class StringBuilderTest {

    public static void main(String[] args) {
        
        // 使用参数指定的字符串内容来构造对象,容量应该为 字符串长度 +16 
        StringBuilder sb1 = new StringBuilder("hello");
        
        // 打印字符串对象的容量
        int cc = sb1.capacity();
        System.out.println(""hello"的容量值 :"+cc);    // 5+16=21    5:"hello"的长度
        System.out.println();
        
        // 打印字符串对象中字符的个数
        int length = sb1.length();
        System.out.println(""hello"的字符个数:"+length);
        System.out.println();
        
        
        // 思考:既然直接对字符串更改,为啥还要返回值呢?
        // 返回值的目的是 为了能够进行多次连续调用
        // sb1.insert(2, "12345").append("12345").delete(0, 1).reverse().toString().length();
        
        // 向下标为2的位置,插入字符串“1234”
        StringBuilder sb2 = sb1.insert(2, "1234");
        System.out.println("向下标为2的位置,插入字符串“1234”:   sb2= "+sb2);
        System.out.println();
        System.out.println("打印sb1= "+sb1);
        System.out.println();
        
        // 打印字符串对象的容量,当插入的数据没有超过容量时,则容量不变
        // 当插入的数据内容超过容量范围时,容量变大
        cc = sb1.capacity();
        System.out.println(""hello"的容量:"+cc); 
        System.out.println();
        
        // 打印字符串对象中字符的个数
        System.out.println(""hello"字符个数: "+sb1.length());
        System.out.println();
        
        // 向字符串中下标为9的位置 插入"ABCD",插入到当前字符串的末尾
        sb1.insert(9, "ABCD");
        System.out.println("向字符串中下标为9的位置 插入"ABCD",插入到当前字符串的末尾:    sb1= "+sb1); 
        System.out.println();
        
        // 将字符串"world"追加到当前字符串的末尾
        sb1.append("world");
        System.out.println("将字符串"world"追加到当前字符串的末尾:    sb1= "+sb1); 
        System.out.println();
        
        // 将字符串中 "1234"删除掉
        sb1.delete(2, 6);           // [2,6)
        System.out.println("将字符串中 "1234"删除掉:     sb1= "+sb1); 
        System.out.println();
        
        // 将字符串中"ABCD"替换成"abcd"
        sb1.replace(5, 9, "abcd");
        System.out.println("将字符串中"ABCD"替换成"abcd"   sb1= "+sb1); 
        System.out.println();
        
        // 实现字符串的反转
        sb1.reverse();
        System.out.println("实现字符串的反转:   sb1= "+sb1); 
    }

}

 

 

 

结果

 

"hello"的容量值 :21

"hello"的字符个数:5

向下标为2的位置,插入字符串“1234”:   sb2= he1234llo

打印sb1= he1234llo

"hello"的容量:21

"hello"字符个数: 9

向字符串中下标为9的位置 插入"ABCD",插入到当前字符串的末尾:    sb1= he1234lloABCD

将字符串"world"追加到当前字符串的末尾:    sb1= he1234lloABCDworld

将字符串中 "1234"删除掉:     sb1= helloABCDworld

将字符串中"ABCD"替换成"abcd"   sb1= helloabcdworld

实现字符串的反转:    sb1= dlrowdcbaolleh

 

 

 

 

 

 

 

 


 

 

二、StringBuffer 类

 

 

 

 

 

 

 

 


 

以上是关于StringBuilder / StringBuffer类的主要内容,如果未能解决你的问题,请参考以下文章

C# stringbuilder为啥高效

stringbuffer与stringbuilder的区别?

C# string 和 stringbuilder

StringBuilder怎么用?

StringBuffer和StringBuilder之StringBuilder为什么线程不安全

第3章 StringBuilder类