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(); //数组长度初始为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")追加完了后,最后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); } |
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 ...
随机推荐
- 并发容器-ConcurrentHashMap,CopyOnWriteArrayList
ConcurrentHashMap HashMap是线程非安全的,在多线程环境下,采用的是Fail-Fast快速失败机制,即当A线程在访问容器的时候,如果此时B线程修改了HashMap的结构,那么就会 ...
- C++之旅:拷贝构造与友元
拷贝构造与友元 拷贝构造是在构造一个对象的时候将已有对象的属性拷贝给新的对象:友元可以让一个类的所有属性(主要是private)对特定的类开放 拷贝构造 如果没有复写拷贝构造函数,系统会帮我们默认生成 ...
- IDEA 2018.2破解
最新的IDEA激活方式 使用网上传统的那种输入网址的方式激活不了,使用http://idea.lanyus.com/这个网站提供的工具进行 1.进入hosts文件中:C:\Windows\System ...
- JSON.stringify without quotes on properties?
https://stackoverflow.com/questions/11233498/json-stringify-without-quotes-on-properties/11233515 va ...
- Let Her Go
转自:https://www.zhihu.com/question/29255072/answer/43962611 [MV]Passenger-Let Her Go-高清MV在线播放 版本一 Let ...
- 解决“检测到有潜在危险的Request.Form值”
先看如下 web.config 的代码: <system.web> <compilation debug="true" targetFramework=& ...
- 【英语学习】How do I stop overthinking at night?
2017-04-03 If you were to say to the grown-ups: "I saw a beautiful house made of rosy brick, wi ...
- git服务器-------》用户免密git操作
找到/etc/ssh/sshd_config文件 开启 RSAAuthentication yesPubkeyAuthentication yesAuthorizedKeysFile .ss ...
- golang中文字符编码转换
golang 有很多需要将中文转成utf8的 网上搜到一个直接转的,记录下,备用 package main import "golang.org/x/text/encoding/simpli ...
- 20145216史婧瑶《Java程序设计》第一周学习总结
20145216 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 Java平台概论 1.1 Java不只是语言 1.Java三大平台:Java SE.Java EE与Java ...