为什么要出现字符缓冲区

我们都知道,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. APP测试(appium+Python基础操作)一

    一.Appium入门案例 demo from appium import webdriver from time import sleep # server 启用参数 desired_caps = { ...

  2. python类属性和实例属性的访问

  3. 【Python】神器:Streamlit,仅使用Python开发一个运维管理后台(不需要编写html,js,css)

    背景 作为SRE,我们有很多很多自动化的工具,大部分都是自动运行的,还有一部分是CLI,我们一直苦于没有一个自己的管理后台网站,受限于前端能力薄弱,开发出来的网页只能说凑活能用,但是不好用. 现在我们 ...

  4. GO学习-(13) Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有"类"的概念,也不支持"类"的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. ...

  5. TensorFlow六种激活函数

    TensorFlow六种激活函数 每个神经元都必须有激活函数.神经元提供了模拟复杂非线性数据集所必需的非线性特性.该函数取所有输入的加权和,进而生成一个输出信号.把它看作输入和输出之间的转换.使用适当 ...

  6. CVPR2020:端到端学习三维点云的局部多视图描述符

    CVPR2020:端到端学习三维点云的局部多视图描述符 End-to-End Learning Local Multi-View Descriptors for 3D Point Clouds 论文地 ...

  7. 包及权限配置&java存储机理绘制

    包及权限配置 包的声明和导入 //声明 package aa.bb.cc; public class A{;} class B{;} //即在java输出目录aa.bb.cc中放入编译后的A.clas ...

  8. 重新整理 mysql 基础篇————— mysql 事务[三]

    前言 简单整理一下事务. 正文 事务有四大特性: 1.原子性(atomicity) 一个事务必须被视为一个不可分割的最小单元. 2.一致性(consistency) 数据库总是从一个一致性的状态转换到 ...

  9. P1091 [NOIP2004 提高组] 合唱队形

    题目描述 $N$位同学站成一排,音乐老师要请其中的$\left ( N-K\right )$位同学出列,使得剩下的$K$位同学排成合唱队形. 合唱队形是指这样的一种队形:设$K$位同学从左到右依次编号 ...

  10. Java @SuppressWarnings:抑制编译器警告-4

    Java 中的 @SuppressWarnings 注解指示被该注解修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告,且会一直作用于该程序元素的所有子元素.例如,使用 @Supp ...