Java常用类:StringBuilder

一、介绍

StringBuilder是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)StringBuilder类可以用于在无需创建一个新的字符串对象情况下修改字符串。StringBuilder不是线程安全的,而StringBuffer是线程安全的。但StringBuilder在单线程中的性能比StringBuffer高。StringBuilder类来源于jdk1.5及以后的版本

常用方法:

1、append();   //追加到末尾

2、insert(int offset,String str) ;   //在指定的索引处插入字符串

3、delete(int startIndex,int endIndex)  //删除区域索引[startIndex,endIndex)的字符

4、reverse()  //反转

StringBuilder的孪生兄弟StringBuffer,因为它们有一个相同的父类AbstractStringBuilder

二、源码解析

1

2

3

4

5

//同样,StringBuilder也是final修饰的不可变,相比String来说,继承了AbstractStringBuilder,StringBuffer也是同样继承了该类

public final class StringBuilder

    extends AbstractStringBuilder

    implements java.io.Serializable, CharSequence

{

AbstractStringBuilder类是一个抽象类,有两个子类:StringBuffer和StringBuilder

AbstractStringBuilder类中有两个属性,分别是char value[];//值、int count;//长度。所以,StringBuilder里是直接可以用的。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

public StringBuilder() {

    super(16);//默认创建了一个长度为16的char数组

}

public StringBuilder(int capacity) {

    super(capacity);//也可以自定义长度

}

public StringBuilder(String str) {

    super(str.length() + 16);//调用父类构造器:并且在原来的16上再加上传来str的长度

    append(str);//然后再追加

 }

 //看看append方法

public StringBuilder append(String str) {

    super.append(str);//调用了父类的append方法。

    return this;

}

public AbstractStringBuilder append(String str) {

    if (str == null) str = "null";

        int len = str.length();

    if (len == 0) return this;

    int newCount = count + len;

    if (newCount > value.length)

        expandCapacity(newCount);

    str.getChars(0, len, value, count);//从0开始,到当前数组长度,进行拷贝

    count = newCount;

    return this;

}

StringBuilder重载了很多append方法

查看源码发现,所有的append方法里最后都有一句return this,有什么作用呢?


1

2

3

4

5

6

7

8

9

10

11

12

//StringBuilder的创建

StringBuilder sb = new StringBuilder();//数组长度初始为16

StringBuilder sb2 = new StringBuilder(32);//长度直接为32

StringBuilder sb3 = new StringBuilder("abc");//1、初始化长度为16+abc的长度=19    2、把a,b,c放到长度为19的value数组里value={‘a‘,‘b‘,‘c‘,‘\u0000‘,‘\u0000‘,‘\u0000‘.....}

//StringBuilder的append

sb.append("a").append("b").append("c");//源码中return this的作用(方法链)

/**

 * 上述sb.append("a").append("b").append("c")代码解析:

 * sb.append("a")追加完了后,最后return this,也就还是sb对象。

 * sb.append("a").append("b") 也就等于sb.append("b")  最后还是return this

 * sb.append("a").append("b").append("c") 也就等于sb.append("c") 最后还是return this

 */

return this的作用就是使调用成一个方法链,可以一直调用append。

三、总结

1、StringBuilder和StringBuffer都是继承了AbstractStringBuilder这个抽象类

2、StringBuilder同样是final修饰的,不可改变。跟String很多类似的地方

3、StringBuilder线程不安全,单线程效率高(比较常用)

4、StringBuilder创建对象个数问题:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

StringBuilder sb4 = new StringBuilder("abc");//这里两个对象,一个abc,一个new StringBuilder

for (int i = 0; i < 10; i++) {

    sb4.append(i);//这里从始至终还是sb4一个对象

}//以上代码块,总共2个对象

//这里有个问题,既然内部是用数组实现的。并且长度也是指定的了。那么每次append不就增加一个了吗?

//那这个长度是怎么加上的呢,这就得说内部的容量扩容了,继续查看源码,源码中有一句关键代码:

if (spaceNeeded > value.length)//如果大于数组长度

            expandCapacity(spaceNeeded);//则,扩容

//expandCapacity方法

void expandCapacity(int minimumCapacity) {

    int newCapacity = (value.length + 1) * 2;//1,计算新容量:在原来的基础上+1然后乘2

        if (newCapacity < 0) {

            newCapacity = Integer.MAX_VALUE;

        } else if (minimumCapacity > newCapacity) {

        newCapacity = minimumCapacity;

    }

    //2,重新复制出一个新数组,新数组的长度就是刚计算的长度。然后将原来的value变量指向到新数组。

    //原来的老数组value没有被引用了,就会被垃圾回收

    value = Arrays.copyOf(value, newCapacity);

}

来自为知笔记(Wiz)

时间: 2024-10-12 20:20:38

Java常用类:StringBuilder的相关文章

Java基础 —— Java常用类

Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@"+哈希码(一般用于覆盖). equals()方法:返回"=="操作的布尔值(一般用于覆盖). finalize()方法:用于对象的销毁(不受人为控制,由JVM调用,遵从垃圾回收机制). clone()方法:用于对象之间的拷贝(深拷贝). getClass()方法:返回对象的字节码文件对

一大波Java来袭(三)Java常用类

本文简单介绍集中Java常用类 不同种类的工具用于处理不同的工作.比如:厨房中的工具用于烹饪:农场中的工具用于养殖--对于Java的学习中处理不同的工作也要采用不同的工具.如:处理数学函数问题用Math类.针对文件的操作采用File类--这也充分体现了Java面向对象的特点 一.字符串类(重点理解内存模型) (一)String Java.lang.String字符串常量,具有不可变性. (二)StringBuffer Java.lang.StringBuffer字符串可变量,是线程安全的. (三

Android逆向之Java常用类

Android逆向之Java常用类 包装类 byte ­> Byte int ­> Integer short ­> Short long ­> Long float ­> Float double ­> Double boolean ­> Boolean char ­> Character   public static void test0(){        int n =123456;      // 整型转字符串         String nu

JAVA 常用类System以及Properties类的使用

package ioTest.io1; import java.util.Iterator; import java.util.Properties; import java.util.Set; /* * System: * API描述:public final class System extends Object * System 类包含一些有用的类字段和方法.它不能被实例化. * 在 System 类提供的设施中,有标准输入.标准输出和错误输出流:对外部定义的属性和环境变量的访问: * 加

java常用类之String类

public class StringTest{ /* * 1.字符串类: String . * 1) 什么是字符串? * 用一对双引号将一个或多个字符括起来组成的字符系列.例如: "A" "ABC" * 特殊的串: 一对连续的双引号.即: "" ,它称之为空串.也称之为长度为0的字符串. * * 2) 字符串的特性: * a) 字符串属于引用类型,一个字符串就是一个对象. * b) 字符串是不变的. * c) 字符串中每一个字符都有一个索引号(

java常用类之封装类

public class BaseTypeClassTest { /*  *   常用类  *   1.基本类型的封装类:  在Java语言中,八种基本类型均对应着一个封装类.  *   *    byte ====>>>  Byte  *    short ===>>>  Short  *    int =====>>>  Integer  *    long ====>>>  Long  *   *    float ===>

Java——常用类(String)

[常用类] <1>字符串相关类(String.StringBuffer) <2>基本数据类型包装类 <3>Math类 <4>File类 <5>枚举类 [String类] <1>java.lang.String类代表不可变的字符序列. <2>String类的常见构造方法: String(String original) //创建一个String对象为original的拷贝 String(char[] value) //用一个

Java常用类集接口以及实现方式总结

最近学习map-reduce原理以及map-reduce编程,于是顺带着学习下Java编程,对于Java常用的数据结构和类集,我总结到mind图中,便于理清相互之间的关系 package leiji; import java.util.ArrayList; import java.util.List; import java.util.Collection; public class ArryList { public static void main(String args[]){ List

java常用类-String

Java String 类 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 创建字符串 创建字符串最简单的方式如下: 1 String greeting = "小猛"; 在代码中遇到字符串常量时,这里的值是 "小猛"",编译器会使用该值创建一个 String 对象. 和其它对象一样,可以使用关键字和构造方法来创建 String 对象. String 类有 11 种构造方法,这些方法

Java常用类、接口关系图谱

呕心沥血画出此图,希望在使用Java类.接口时捋顺其关系,从而更好的组织程序逻辑---请看图 Object分出来的类都是其子类 Iterable接口分出的也是子接口 从继承关系分析,其父类实现的接口子类都被继承,子类扩展的接口,有实现同一接口的被框起了, 集合类被框起来并用实线带箭头链接其来一并实现了Serializable和Clonable接口,可见一斑 图片较大建议下载后查看更清晰,后续会继续添加常用类与接口 原文地址:https://www.cnblogs.com/Open-ing/p/1