Java常用类:StringBuilder
一、介绍
//同样,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();//数组长度初始为16StringBuilder sb2 = new StringBuilder(32);//长度直接为32StringBuilder sb3 = new StringBuilder("abc");//1、初始化长度为16+abc的长度=19 2、把a,b,c放到长度为19的value数组里value={'a','b','c','\u0000','\u0000','\u0000'.....}//StringBuilder的appendsb.append("a").append("b").append("c");//源码中return this的作用(方法链)/** * 上述 * 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 StringBuilderfor (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);} |
Java常用类:StringBuilder的更多相关文章
- 深入理解Java常用类-----StringBuilder
上篇文章我们介绍过String这个常用类,知道了该类的内部其实是用的一个char数组表示一个字符串对象的,只是该字符数组被final修饰,一旦初始化就不能修改,但是对于经常做字符串修改操作的情况下,S ...
- Java基础 —— Java常用类
Java常用类: java.lang包: java.lang.Object类: hashcode()方法:返回一段整型的哈希码,代表地址. toString()方法:返回父类名+"@&quo ...
- Java常用类学习笔记总结
Java常用类 java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String ...
- Java 常用类总结(SE基础)
本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习. 1. 字符串相关的类 1.1 String String是一个final类,代表不可变的字符序列.不可被继承. Strin ...
- Java常用类之要点总结
Java常用类之要点总结
- Java常用类:包装类,String,日期类,Math,File,枚举类
Java常用类:包装类,String,日期类,Math,File,枚举类
- Java常用类的使用
Java常用类 1. Optional 在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行 一 些防御式的检查,所以在代码中常常可见if( ...
- java常用类
String 字符串类 System 可得到系统信息 Runtime类 StringBuilder(StringBuffer)类 Thread 线程类 Math 与数学有关的工具类 Date 日期类( ...
- java常用类-上
一,常用类之一包装类 java开发中习惯把八大基本数据类型封装到一个类中,并提供属性和方法,更方便的操作基本数据类型. 包装类的出现并不是用于取代基本数据类型,也取代不了. 包装类位于java.lan ...
- 第十四章 Java常用类
14.常用类 14.1 字符串相关的类 1课时 14.2 JDK 8之前时间日期API 1课时 14.3 JDK8中新时间日期API 1课时 14.4 JDK8中的Optional类 1课时 14.5 ...
随机推荐
- vultr VPS安装BBR
1.安装 wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh chmod +x bbr.s ...
- Delphi7编译时,发生Access violation at address 00A7B628 in module 'dcc70.dll'. Read of address 00000000.(Delphi6升级到Delphi7)
最近接了一个项目,要求使用Delphi7来开发程序,可是由于我们之前均使用delphi6来开发程序的,而且Delphi6使用很长时间了,积累并改造了第三方控件很成熟了: 故把Delphi6的控件移植( ...
- 基于tomcat集群做session共享
前端代理服务器nginx:192.168.223.136 tomcat服务器:采用的一台多实例192.168.223.146:8081,192.168.223.146:8082(如何构建多实例tomc ...
- SVN主从高可用
https://blog.csdn.net/conwayli/article/details/80235738
- JVM反调调用优化,导致发生大量异常时log4j2线程阻塞
背景 在使用log4j2打日志时,当发生大量异常时,造成大量线程block问题的问题. 一个关于log4j2的高并发问题:https://blog.fliaping.com/a-high-concur ...
- 大端和小端(big endian little endian)
一.大端和小端的问题 对于整型.长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian 则相反,它 ...
- 数据结构(十一)B树
之前的二叉排序树,平衡二叉树都是基于二叉树的实现,但是在搜索过程中,效率和树的深度有关,所以就想到把二叉树改为多叉树,B树和B+树都基于多叉树的实现 多路查找树 B树 定义 应用场景 B+树 ...
- mathematical method
mathematical method 曲线拟合 指数 \(lnY = lna + bX\) 对数 \(Y = blnX + a\) 幂函数 \(lgY=lga+blgX\) 多元线性回归模型 回归分 ...
- C++输入/输出流
2017-08-17 09:03:28 writer:pprp 基本的输入/输出流 默认情况下,输入操作会丢弃前导空白,读取数据,遇到空白的时候停止读入: 如果希望的如包括空白在内的任意字符,可以使用 ...
- PHP对象的使用,什么时候可以用中括号[], 什么时候可以用箭头->
$orderTPLMessage = (object)array( 'touser' => '这里填open id', 'template_id' => 'oQDOldy7q6CdaYw2 ...