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中提供给开发者使用的类,这些类将底层的代 ...
随机推荐
- java学习之旅
jar文件其实就是一个压缩包,里面包含很多class文件(一个class文件是一个类的字节码).方便在网络上传输.可以规定版本号,更容易进行版本控制. var只能在方法内使用,不能用于定义成员变量. ...
- 『动善时』JMeter基础 — 32、JMeter察看结果树组件详解
目录 1.察看结果树介绍 2.察看结果树界面详解 3.察看结果树的其他功能 (1)将数据写入文件中 (2)Search功能 (3)Scroll automatically选项 4.总结 1.察看结果树 ...
- C语言编译器开发之旅(开篇)
编译器写作之旅 最近在Github上看到一个十分有趣的项目acwj(A Compiler Writing Journey),一个用C语言编写编译器的项目.身为一个程序员,这在我看来是一件十分酷的事 ...
- 用OpenCV进行摄像机标定
用OpenCV进行摄像机标定 照相机已经存在很长时间了.然而,随着廉价针孔相机在20世纪末的引入,日常生活中变得司空见惯.不幸的是,这种廉价伴随着它的代价:显著的扭曲.幸运的是,这些常数,通过校准和一 ...
- 『言善信』Fiddler工具 — 11、Fiddler中Composer功能详解
目录 1.Composer功能介绍 2.Composer界面说明 3.使用方式 (1)自定义Request请求 (2)Composer重复发送请求 (3)Composer篡改请求数据 1.Compos ...
- 实验5、Flask设计模式和Web服务体验
1. 实验内容 Flask appbuilder包括基本的表单验证,内置管理模块.本节主要学习Flask appbuilder的后台管理模块使用和对Flask设计模式拓展作简要介绍 2. 实验要点 掌 ...
- 一款基于SpringBoot+SpringSecurity的后台管理系统,强烈推荐
简介 Base Admin一套简单通用的后台管理系统,主要功能有:权限管理.菜单管理.用户管理,系统设置.实时日志,API加密,以及登录用户修改密码.配置个性菜单等. 技术栈 前端:Layui 后端: ...
- 【模板】 RMQ求区间最值
RMQ RMQ简单来说就是求区间的最大值(最小值) 核心算法:动态规划 RMQ(以下以求最大值为例) F[i,j]表示 从 i 开始 到i+2j -1这个区间中的最大值 状态转移方程 F[i,j]=m ...
- hackthebox TheNotebook
前言 只拿到了user,提权没成功--有wp说是CVE-2019-5736,我没打成. 打点 nmap-sV -v -A 10.10.10.230 端口扫描结果: PORT STATE SERVICE ...
- 第三天编程学习Hello,World!
真正意义上迈入编程的大门--Hello,World! 新建一个文件夹(最好在桌面),方便存放代码 新建一个文件(如:Hello.txt) 改文件后缀名为.java 扩展文件得到Hello.java 编 ...