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 ...
随机推荐
- 谈面向对象的编程(Python)
(注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 今天中秋节,也没什么特别的,寻常日子依旧. 谈谈面向对象吧,什么叫面向对象? 那么问题来了,你有对象吗? 嗯,,,那我可 ...
- qml源码查看
已5.4为例说明: QtQuick源码查看: 地址:Qt\Qt5.4.1\5.4\Src\qtdeclarative\src\quick\items Qt control源码查看: 地址:\Qt\Qt ...
- Ubuntu16.04安装Jenkins
Jenkins基于JAVA,所以需要先安装jdk 安装java 在官网上下载jdk,http://www.oracle.com/technetwork/java/javase/downloads/jd ...
- docker基本用法和命令
1.安装docker 检查有没有curl which curl 如果没有用以下命令可安装:sudo apt-get install curl 通过官方提供的脚本安装最新docker curl -sSL ...
- ONVIF学习-ONVIF开发框架搭建(C++)
第一步.下载gsoap 从gsoap官网(http://www.genivia.com/products.html#notice)下载最新版gsoap(博主用的是gsoap_2.8.45).gsoap ...
- Web开发相关笔记 #02#
[1] HTML 插入第三方. [2] [3] JavaScript 回调函数 & 模块化 --> 用变量封装数据.方法 --> 类比 Java 中的 package var fe ...
- web.xml<context-param>与<init-param>的作用与区别
<context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件we ...
- Spring Boot企业微信点餐系统
第1章 课程介绍 包括项演示.课程概述.课程安排.学习前提等的介绍, 让同学们了解这课程 1-1 课程介绍 第2章 项目设计 包括需求分析,项?目设计,项?目架构,数据库设计等等. 2-1 项目设计 ...
- kafka log文件和offset原理
log与offset 日志存储路径根据配置log.dirs ,日志文件通过 topic-partitionId分目录,再通过log.roll.hours 和log.segment.bytes来分文件, ...
- jQuery使用ajaxSubmit()提交表单(在不希望页面跳转的情况下)
原文:http://www.jb51.net/article/48728.htm ajaxSubmit(obj)方法是jQuery的一个插件jquery.form.js里面的方法,所以使用此方法需要先 ...