为什么要出现字符缓冲区

我们都知道,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)的更多相关文章

  1. Java 字符串拼接 StringBuilder() StringBuffer

            字符串拼接 普通方式 public class StringDemo2 { public static void main(String[] args) { // 表示获取从1970- ...

  2. java 字符串缓冲区与正则表达式

    一 字符串缓冲区 1.StringBuffer类 查阅StringBuffer的API,StringBuffer又称为可变字符序列,它是一个类似于 String 的字符串缓冲区,通过某些方法调用可以改 ...

  3. < java.lang >-- StringBuilder字符串缓冲区

    JDK1.5出现StringBuiler:构造一个其中不带字符的字符串生成器,初始容量为 16 个字符.该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候( ...

  4. Java 之 可变字符序列:字符串缓冲区(StringBuilder 与 StringBuffer)

    一.字符串拼接问题 由于 String 类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象. Demo: public class StringDemo { public ...

  5. StringBuilder字符串缓冲区

    JDK1.5出现StringBuiler:构造一个其中不带字符的字符串生成器,初始容量为 16 个字符.该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候( ...

  6. 【原】Java学习笔记023 - 字符串缓冲区_正则表达式

    package cn.temptation; import java.util.Arrays; public class Sample01 { public static void main(Stri ...

  7. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

  8. Java学习(API及Object类、String类、StringBuffer字符串缓冲区)

    一.JAVA的API及Object类 1.API 概念: Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就 ...

  9. Java的API及Object类、String类、字符串缓冲区

    Java 的API 1.1定义 API: Application(应用) Programming(程序) Interface(接口) Java API就是JDK中提供给开发者使用的类,这些类将底层的代 ...

随机推荐

  1. 对狂神的shiro的学习总结

    1.shiro的10分钟快速开始 导入依赖 新建一个普通的maven项目,然后new一个hello-shiro(moudle)作为第一个测试项目 具体框架如下: 导入对应的依赖在pom.xml文件里 ...

  2. Go语言流程控制03--goto跳转到任意标签位置

    package main import ( "fmt" "time" ) func main() { STUDYHARD: fmt.Println(" ...

  3. 插件 ExcelWrite 导出Excel格式数据/获取图层

    使用ExcelWrite 插件可以导出Excel格式的数据: ExcelFile端口接 文件数据路径 最后面的是文件名,不用写格式 如果存储树形数据,需要 勾选 List To Row 选项: 附: ...

  4. deeplearning模型库

    deeplearning模型库 1. 图像分类 数据集:ImageNet1000类 1.1  量化 分类模型Lite时延(ms) 设备 模型类型 压缩策略 armv7 Thread 1 armv7 T ...

  5. Linux下Flash-LED的处理

    Linux下Flash-LED的处理 一些LED设备提供两种模式-torch和flash.在LED子系统中,LED类(参见Linux下的LED处理)和LED Flash类,分别支持这些模式.torch ...

  6. NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架

    NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架 Introducing NVIDIA Jarvis: A Framework for GPU-Accelerated Conversa ...

  7. 蓝牙mesh网络技术的亮点

    蓝牙mesh网络技术的亮点 The highlights of Bluetooth mesh networking technology 导言 蓝牙是当今最主要的低功耗无线技术之一,对无线设备用户和开 ...

  8. 使用TensorRT集成推理inference

    使用TensorRT集成推理inference 使用TensorRT集成进行推理测试. 使用ResNet50模型对每个GPU进行推理,并对其它模型进行性能比较,最后与其它服务器进行比较测试. ResN ...

  9. pytest的allure的环境配置

    一.下载地址: https://github.com/allure-framework/allure2/releases 二.配置环境变量: 三.验证allure安装成功

  10. 工作流中容器化的依赖注入!Activiti集成CDI实现工作流的可配置型和可扩展型

    Activiti工作流集成CDI简介 activiti-cdi模块提供activiti的可配置型和cdi扩展 activiti-cdi的特性: 支持 @BusinessProcessScoped be ...