为什么要出现字符缓冲区

我们都知道,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. Wrong——Python

    1.向MySQL中插入时间(年月日时分秒),在时分秒处报错.在年月日与时分秒中间有个空格.解决办法:在sql语句中时间用一个" "包起来就可以了.. 2.在Ubuntu的cront ...

  2. GO语言常用标准库04---flag读取命令行参数

    package main import ( "flag" "fmt" "math" "os" ) /* go build ...

  3. 201871030132-熊文婷 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...

  4. MindSpore模型推理

    MindSpore模型推理 如果想在应用中使用自定义的MindSpore Lite模型,需要告知推理器模型所在的位置.推理器加载模型的方式有以下三种: 加载本地模型. 加载远程模型. 混合加载本地和远 ...

  5. YOLOv3和YOLOv4长篇核心综述(上)

    YOLOv3和YOLOv4长篇核心综述(上) 对目标检测算法会经常使用和关注,比如Yolov3.Yolov4算法. 实际项目进行目标检测任务,比如人脸识别.多目标追踪.REID.客流统计等项目.因此目 ...

  6. mysql 高级和 索引优化,目的:查的好,查的快,性能好

    1-事物隔离级别: 更新丢失, 并发情况下,对同一字段进行更新,就会出现更新丢失,采用乐观锁,比较版本号或时间戳可解决 读未提交 解决了更新丢失但是会引起脏读, 二个session.sessionA中 ...

  7. Java中List集合转Map集合报错:Duplicate key

    一.问题由来 最近生成环境刚发布了一个版本,本人负责优化的一个功能在进行测试时,报错了一个异常,duplicate key;去百度里面看了一下, 意思很明确就是建重复,而且错误是在Java代码中抛出来 ...

  8. 十一、设置Nginx开机自启动

    一.创建nginx.service文件 [root@svr7 ~]# vim /lib/systemd/system/nginx.service [Unit]Description=nginx ser ...

  9. .Net Redis实战指南——常用命令

    本问主要介绍rabbitmqctl工具的常用命令. vhost 一个RabbitMQ服务器可以创建多个虚拟的消息服务器,称之为虚拟主机(virtual host),简称为vhost.vhost之间是绝 ...

  10. day20200911

    UG12.0进入运动仿真模块 新建仿真 定义固定连杆 定义其他连杆 定义运动副 定义驱动 定义解算方案并求解 导出动画