Java | 字符串缓冲区(StringBuilder)
为什么要出现字符缓冲区
我们都知道,String类是不可变的,但是有的时候,我们要用到字符串的拼接,如果拼接的数量小的时候,还可以,但是如果拼接的数据量太大的话,内存的占用就太大了,所以这个时候再用String类的话,就非常的不方便了,必须要有一个类,在拼接字符串,不大量占用内存的类,又可以拼接。所以StringBuilder类和StringBuffer类就来了。
字符缓冲区有几种
字符缓冲区有两种:
StringBuilder 线程不安全,但是效率高。
StringBuffer 线程安全,但是效率不高。
这两个类都继承了 AbstractStringBuilder抽象类,所以大部分都是一样的。他们两个的底层都是数组,只有这样才可以在不占用太多内存的情况下进行,字符串的拼接。
字符缓冲区
下面主要说的是StringBuilder类:
构造方法
StringBuilder类里面有四种构造方法,常用的也就这三种了,分别是:
第一种:(无参构造方法)
public StringBuilder() {
super(16);
}
无参的构造方法,是直接调用父类的构造方法,创建了一个长度为16的数组。·
父类里面的方法:
//主要的操作的数组
char[] value;
//父类里面的构造方法
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
第二种:(初始化了缓冲区大小)
public StringBuilder(int capacity) {
super(capacity);
}
第二种方法是通过用户传递的值来直接进行初始化的一个数组。
第三种:(通过字符串来初始化缓冲区)
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
第三种方法是传过来一个字符串,用字符串的长度加上16,创建出来一个节符缓冲区,然后再把传过来的字符串添加到新创建的字符缓冲区中。
操作与常用方法
追加字符串
//源码(不光这一个,但是最常用的就是这一个了)
public StringBuilder append(String str) {
super.append(str); //调用父类里面的追加方法,把字符串追加到原数组里面
return this; //返回当前对象,说明可以使用链式方法
}
使用:
StringBuilder sbu = new StringBuilder();
sbu.append("a");
sbu.append("b"); //可以一个一个的追加
System.out.println(sbu); //ab
sbu.append("c").append("d"); //也可以在一行里面追加
System.out.println(sbu); //abcd
还有就是有人问如果StringBuilder里面的字符数组的长度用完了怎么办,其实源码里面也是有考虑到这种情况的,在每一次appen的时候,都会判断一下数组的长度够不够,如果不够就会自动扩容,每一次扩容都是上一次容量的2倍再加2,然后就再创建一个新的数组,把原来的数组拷贝过来。
删除字符
删除字符有两个方法,可以删除指定下标的字符,也可以删除一串字符串。方法:
public StringBuilder deleteCharAt(int index) , public StringBuilder delete(int start, int end)
使用:
StringBuilder sbu = new StringBuilder("abcdefghijklmnopqrstuvwxyz");
//删除下标从1到开始到3的字符串
StringBuilder deleteSbu = sbu.delete(1, 3);
System.out.println(deleteSbu); //adefghijklmnopqrstuvwxyz
//也可指定删除那一个位置的字符 删除位置0的字符
StringBuilder deleteChar = sbu.deleteCharAt(0);
System.out.println(deleteChar ); //defghijklmnopqrstuvwxyz
插入字符
插入字符串都是从插入的地方下标之前开始插入的,比如一个字符下标为1,如果插入的地方是1的话,那么这个字符之后的下标就不是1了。
例:
StringBuilder sbu = new StringBuilder("abc");
//从下标为1的地方开始插入字符串
StringBuilder newSbu = sbu.insert(1, "***");
System.out.println(newSbu); //a***bc
字符串反转
和String类中的字符串反转一样。方法:public StringBuilder reverse()
例:
StringBuilder sbu = new StringBuilder("abc");
//字符串反转
System.out.println(sbu.reverse()); //cba
转换成String类型
StringBuilder类在拼接字符串的时候可以用,但是大部分的时候,我们用的还是String类,所以必须要可心转换才可以。方法:public String toString()
源码:
public String toString() {
// 就是从新创建一个字符串,再返回来,value是数组,count是数组的长度
return new String(value, 0, count);
}
便用:
StringBuilder sbu = new StringBuilder("abc");
String s = sbu.toString(); //转换成String类型了
以上就是StringBuilder里面比较常用的方法,但是还有很多的方法可以参考API,这里不再多说,然后就是StringBuilder里面非常多的操作方法其实都是和String类里面非常的相似的。还有就是StringBuffer里面的方法和StringBuilder类里面的方法其实用法上都是一样的,就是线程的安全程度不一样。
细节决定成败!
个人愚见,如有不对,恳请扶正!
Java | 字符串缓冲区(StringBuilder)的更多相关文章
- Java 字符串拼接 StringBuilder() StringBuffer
字符串拼接 普通方式 public class StringDemo2 { public static void main(String[] args) { // 表示获取从1970- ...
- java 字符串缓冲区与正则表达式
一 字符串缓冲区 1.StringBuffer类 查阅StringBuffer的API,StringBuffer又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改 ...
- < java.lang >-- StringBuilder字符串缓冲区
JDK1.5出现StringBuiler:构造一个其中不带字符的字符串生成器,初始容量为 16 个字符.该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候( ...
- Java 之 可变字符序列:字符串缓冲区(StringBuilder 与 StringBuffer)
一.字符串拼接问题 由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. Demo: public class StringDemo { public ...
- StringBuilder字符串缓冲区
JDK1.5出现StringBuiler:构造一个其中不带字符的字符串生成器,初始容量为 16 个字符.该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候( ...
- 【原】Java学习笔记023 - 字符串缓冲区_正则表达式
package cn.temptation; import java.util.Arrays; public class Sample01 { public static void main(Stri ...
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...
- Java学习(API及Object类、String类、StringBuffer字符串缓冲区)
一.JAVA的API及Object类 1.API 概念: Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就 ...
- Java的API及Object类、String类、字符串缓冲区
Java 的API 1.1定义 API: Application(应用) Programming(程序) Interface(接口) Java API就是JDK中提供给开发者使用的类,这些类将底层的代 ...
随机推荐
- VirtualBox安装配置CentOS7(含网络连接配置)
最近需要用到CentOS7,特地在虚拟机上安装一遍,中间走了很多弯路,特地在此处进行记录 前置条件: 1.本地完成Oracle VM VirtualBox,我安装的是6.1版本 2.下载CentOS安 ...
- Docker学习(14) Docker容器的数据管理
Docker容器的数据管理 Docker容器的数据卷 重要: Docker的数据卷容器 Docker数据卷的备份和还原
- VTA:深度学习加速器堆栈
VTA:深度学习加速器堆栈 多功能Tensor加速器(VTA)是一个开放的,通用的,可定制的深度学习加速器,具有完整的基于TVM的编译器堆栈.设计VTA来展示主流深度学习加速器的最显着和共同的特征.T ...
- mybatis 实现增删改查(CRUD)
如何创建项目,注入依赖,编写核心配置文件.工具类.实体类这里就不详细说了,具体可以参考下边这条博文 https://www.cnblogs.com/bear7/p/12491937.html 这里将详 ...
- Linkerd 2.10(Step by Step)—1. 将您的服务添加到 Linkerd
为了让您的服务利用 Linkerd,它们还需要通过将 Linkerd 的数据平面代理(data plane proxy)注入到它们服务的 pod 中,从而进行网格化. Linkerd 2.10 中文手 ...
- 【NX二次开发】Block UI 线型
属性说明 常规 类型 描述 BlockID String 控件ID Enable Logical 是否可操作 Group Logical ...
- NOIP模拟测试4「礼物·通讯·奇袭」
礼物. 首先见到期望一定要想dp,看到n的范围无脑想状压, 然后我就只想到这了. dp方程式还是比较好想的,但是我依然想不出来 略经思考 颓题解 依然不会,随便写了个式子 i状态中不含j $f[i ...
- MySQL:一条SQL是如何执行的
目录 MySQL基本架构 Server层 连接器 查询缓存 分析器 优化器 执行器 存储引擎层 InnoDB MyISAM Memory SQL执行流程 MySQL基本架构 在讲SQL语句是如何执行之 ...
- AS打包签名
1.进入项目,然后点击菜单栏的Build -->Generate Signed APK... (如下图所示) 2.点击之后会出现下图,我这个是我以前有过KEY了,如果你以前没有过的话,都是空 ...
- Linux安装及管理程序
一,常见的软件包封装类型 二.RPM包管理工具 三.查询RPM软件包信息 四.安装.升级.卸载RPM软件包 五.解决软件包依赖关系的方法 六.源代码编译 七.安装yum源仓库 一,常见的软件包封装类型 ...