java 常用类-StringBuffer-StringBuilder
二、StringBuffer类&StringBuilder类
2.1 简介
- java.lang.StringBuffer、StringBuilder代表可变的字符序列,可以对字符 串内容进行增删,此时不会产生新的对象。
- 很多方法与String相同
- 作为参数传递时,方法内部可以改变值。
2.2 String VS StringBuffer VS StringBuilder
String、StringBuffer、StringBuilder三者的异同?
- String:不可变的字符序列;底层使用char[]存储
- StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储
- StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储
源码分析
我们使用new String()创建字符串的时候:
String str = new String(); //底层是这样的:char[] value = new char[0];
String str1 = new String("abc"); //底层是这样的:char[] value = new char[]{'a','b','c'};
我们使用new StringBuffer()创建字符串的时候:
StringBuffer test = new StringBuffer();// 无参:底层是这样的:char[] value = new char[16];底层创建了一个长度是16的数组。
StringBuffer test2 = new StringBuffer("abd");// 有参:底层是这样的:char[] value = new char[test2.leng()+16]
StringBuffer底层部分源码:
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, CharSequence
{ /**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache; /** use serialVersionUID from JDK 1.0.2 for interoperability */
static final long serialVersionUID = 3388685877147921107L; /**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}
}
从中我们可以看出StringBuffer的无参构造器,默认容量是16。点击super我们去StringBuffer的父类看看。
从中我们可以看出,new了长度为16的字符数组,并且给了value这个变量。
有参数:
几个问题
@Test
public void test1() {
StringBuffer str1 = new StringBuffer("abd");
System.out.println(str1.length());
}
(1)System.out.println(str1.length());结果为多少?为什么不为str1.length()+16?
答:3。因为它统计的是你append进去的数量。
(2)扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
答:默认情况下,扩容为原来容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中。
指导意义:开发中建议大家使用:StringBuffer(int capacity) 或 StringBuilder(int capacity)
2.3 StringBuffer类的常用方法
注意:
String的常用方法,StringBuffer和StringBuilder都有,同时它们两个有些String没有的方法
StringBuilder的常用方法和StringBuffer的一样,只不过是同步方法,线程安全。
- StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
- StringBuffer delete(int start,int end):删除指定位置的内容
- StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
- StringBuffer insert(int offset, xxx):在指定位置插入xxx
- StringBuffer reverse() :把当前字符序列逆转
- public int indexOf(String str)
- public String substring(int start,int end)
- public int length()
- public char charAt(int n )
- public void setCharAt(int n ,char ch)
当append和insert时,如果原来value数组长度不够,可扩容。
如上这些方法支持方法链操作。
总结:
增:append(xxx)
删:delete(int start,int end)
改:setCharAt(int n ,char ch) / replace(int start, int end, String str)
查:charAt(int n )
插:insert(int offset, xxx)
长度:length();
*遍历:for() + charAt() / toString()
@Test
public void test1() {
StringBuffer buffer = new StringBuffer("abc");
/*增*/
buffer.append(2);
System.out.println(buffer);
/*删*/
buffer.delete(1,3);
System.out.println(buffer);
/*改1*/
buffer.setCharAt(0,'s');
System.out.println(buffer);
/*改2*/
buffer.replace(0,1,"cxk");
System.out.println(buffer);
/*插*/
buffer.insert(1,"SSS");
System.out.println(buffer);
/*长度*/
int length = buffer.length();
System.out.println(length);
/*遍历*/
for (int i = 0; i < buffer.length(); i++) {
System.out.print(buffer.charAt(i)+" ");
}
System.out.println("\n=================");
/*转为字符串*/
System.out.println(buffer.toString());
}
2.4 三者效率对比
@Test
public void test2() {
//初始设置
long startTime = 0L;
long endTime = 0L;
String text = "";
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
//开始对比
startTime = System.currentTimeMillis();// System.currentTimeMillis()获取当前时间
for (int i = 0; i < 20000; i++) {
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime));
}
效率从高到低排列:StringBuilder > StringBuffer > String
java 常用类-StringBuffer-StringBuilder的更多相关文章
- Java 常用类——StringBuffer&StringBuilder【可变字符序列】
一.字符串拼接问题 由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. Demo: 1 public class StringDemo { 2 pub ...
- java常用类-StringBuffer,Integer,Character
* StringBuffer: * 线程安全的可变字符串. * * StringBuffer和String的区别? * 前者长度和内容可变,后者不可变. * 如果使用前者做字符串的拼接,不会浪费太多的 ...
- Java常用类:StringBuilder
一.介绍 2 3 4 5 //同样,StringBuilder也是final修饰的不可变,相比String来说,继承了AbstractStringBuilder,StringBuffer也是同样继承了 ...
- Java常用类StringBuffer详解
内容多为最近学习的自我总结,可能有些地方写的不严谨,甚至会有错误的地方,仅供参考,如发现错误敬请指出,谢谢! 灰色字体为补充扩展内容,多为帮助自己理解. StringBuffer概述: 线程安全的可变 ...
- 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常用类 1. Optional 在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行 一 些防御式的检查,所以在代码中常常可见if( ...
- Java常用类之要点总结
Java常用类之要点总结
- Java常用类:包装类,String,日期类,Math,File,枚举类
Java常用类:包装类,String,日期类,Math,File,枚举类
随机推荐
- 新建一个Vue项目
node环境以及vue的安装可查看:https://www.cnblogs.com/renlywen/p/13522869.html 第一步:创建项目 终端输入: vue init webpack d ...
- 关于Junit4 和 Junit5.4
1. Junit5.4 主要是用于Maven框架 , 对普通类的测试是不可以的. 如这个, junit4可以, junit5.4不可以. 2. Junit不可以使用 static 静态方法. 关 ...
- 01 . etcd简介原理,应用场景及部署,简单使用
etcd简介 Etcd是CoreOS团队于2013年6月发起的开源项目,他的目标是构建一个高可用的分布式键值(key-value)数据库,etcd内部采用raft协议作为一致性算法,etcd基于Go语 ...
- 什么是URL标准化
http://www.wocaoseo.com/thread-194-1-1.html RL标准化是来自于国外matt cutts的博客文章,期望能给蜘蛛一个规范化的URL作为收录的标准.举个简单的例 ...
- go语言开发入门
go语言开发入门 每个Go程序包含一个名为main的包以及其main函数,在初始化后,程序从main开始执行,避免引入不使用的包(编译不通过) 基础语法 基本数据类型 bool, byte int,i ...
- Nginx Ingress on TKE 部署最佳实践
概述 开源的 Ingress Controller 的实现使用量最大的莫过于 Nginx Ingress 了,功能强大且性能极高.Nginx Ingress 有多种部署方式,本文将介绍 Nginx I ...
- Android中_TextView属性的XML详解 包括单行显示等等。
<pre name="code" class="html">属性名称 描述 android:autoLink 设置是否当文本为URL链接/email ...
- sdf文件可以通过database net4工具升级版本
用database .net4工具打开数据库后,右键数据库->数据库工具->upgrade to->to 4.0 or to 3.5; 可以用来判断数据库版本及是否要升级.
- Android 设备指纹
Android唯一识别号(设备指纹)的生成及原理 https://blog.csdn.net/xiechengfa/article/details/70049409?utm_source=itdada ...
- UGUI核心元素、基本控件、复合控件和高级控件
UGUI的核心元素: Anchor(锚点):每个控件都有一个Anchor属性,控件的4个顶点,分别与Anchor的4个点保持不变的距离,不受屏幕分辨率变化的影响. 系统默认设置控件的Anchor位置在 ...