StringBuffer 和 StringBuilder

StringBuffer 类 简介

  • java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删

  • 很多方法和 String 相同,但 StringBuffer 是可变长度的

  • StringBuffer 是一个容器

注意:

  1. StringBuffer 的直接父类是 AbstractStringBuilder 有属性 char[] value,不是 final 修饰
  2. StringBuffer 实现了 Serializable,即 StringBuffer 的对象可以串行化(可以网络传输,可以保存到文件)
  3. StringBuffer 是一个 final 类,不能被继承

StringBuffer 和 String 对比

  • String 保存的是字符串常量,里面的值不能更改,每次 String 类的更新实际上就是更改地址,效率较低 // private final char[ ] value
  • StringBuffer 保存的是字符串变量,里面的值可以更改,不用每次更新地址,效率较高 // char[ ] value 放在堆中

StringBuffer的构造器

// Constructor and Description
StringBuffer()
// 构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符
StringBuffer(CharSequence seq)
// 构造一个字符串缓冲区,包含与指定的CharSequener相同的字符
StringBuffer(int capacity)
// 构造一个其中不带字符,但具有指定初始容量的的字符串缓冲区,即对char[]大小进行指定
StringBuffer(String str)
//// 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

StringBuffer 和 String 的相互转换

String ---> StringBuffer

String s = "hello";

方式一:

 StringBuffer b1 = new StringBuffer(s);

方式二:

StringBuffer b2 = new StringBuffer();
b2.append(s);

StringBuffer ---> String

方式一:

String s2 = b1.toString()

方式二:

String s3 = new String(b1);

StringBuffer 常用方法

StringBuffer	append()	// 增
StringBuffer delete(int start, int end) // 删
StringBuffer insert() // 插入
StringBuffer replace(int start, int end, String str) // 改
int indexOf(String str) // 查
int length() // 获取长度

练习题

String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str); // 调用的AbstractStringBuilder的 appendNull方法
System.out.println(sb.length()); // 4 null --> value = {'n', 'u', 'l', 'l'}
System.out.println(sb.capacity()); // 16 System.out.println(sb);
StringBuffer sb1 = new StringBuffer(str); //NullPointerException super(str.length() + 16);
System.out.println(sb1);

StringBuilder 类 简介

  • 一个可变的字符序列。此类提供与 StringBufffer 兼容的API,但不保证同步。被设计作为 StringBuffer 的建议替换,用在字符串被单个线程使用的时候。如果可能,建议有限采用该类,因在在大多数实现中,他比 StringBuffer 要快。两者的方法基本相同

注意:

  1. StringBuilder 是 final 类,不能被继承
  2. 继承了 AbstractStringBuilder,属性 Char[ ] value,因此字符序列是在堆中
  3. 实现了 Serialzable 接口,序列号(所谓序列号即可以保存类型和数据本身)
  4. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用

String、StringBuffer 和 StringBuilder 的比较

  1. StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,且方法也一样

  2. String 不可变字符序列,效率低,但是复用率高

  3. StringBuffer:可变字符序列,效率较高(增删)、线程安全

  4. StringBuilder:可变字符序列,效率最高,线程不安全

  5. String 使用注意说明:

    String s = "a"; // 创建一个字符串
    s += "b";
    /*
    实际上原来的 "a" 字符串对象已经丢弃了,现在又产生了一个字符串是 s + "b" (即"ab")。如果多次执行这些改变串内容的操作,会导致的大量副本字符串对象存在内存中,降低效率。如果这样的操作放到循环中,会极大的影响程序的性能 ==> 结论:如果我们对String做大量修改,不要使用String
    */

    效率测试

long startTime = 0L;
long endTime = 0L;
// StringBuffer
StringBuffer stringBuffer = new StringBuffer("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
stringBuffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的执行时间:" + (endTime - startTime)); // StringBuilder
StringBuilder stringBuilder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
stringBuilder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的执行时间:" + (endTime - startTime)); //String
String text = "";
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text += i;
}
endTime = System.currentTimeMillis();
System.out.println("String的执行时间:" + (endTime - startTime)); // StringBuffer的执行时间:5
//StringBuilder的执行时间:2
//String的执行时间:1463
// 测试结果:StringBuilder > StringBuffer > String

String、StringBuffer 和 StringBuilder 的选择

使用的原则、结论:

  1. 如果字符串存在大量的修改操作,一般使用StringBuffer 和 StringBuilder

  2. 如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder

  3. 如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer

  4. 如果字符串很少修改,被多个对象引用,使用 String,比如配置信息等

Java 基础复习——StringBuffer 和 StringBuilder的更多相关文章

  1. Java基础(四) StringBuffer、StringBuilder原理浅析

    StringBuilder与StringBuffer作用就是用来处理字符串,但String类本身也具备很多方法可以用来处理字符串,那么为什么还要引入这两个类呢? 关于String的讲解请看Java基础 ...

  2. Java基础之StringBuffer和StringBuilder的区别

    StringBuffer是一个字符串的缓存类,属于一个容器,对于容器,我们可以进行增删改查. StringBuffer的容器长度是可变的,并且里面可以存放多种的数据类型.它跟其他容器,比如数组,是很不 ...

  3. Java基础——数组应用之StringBuilder类和StringBuffer类

    接上文:Java基础——数组应用之字符串String类 一.StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和 ...

  4. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  5. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  6. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  7. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  8. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  9. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  10. 《Java基础复习》-控制执行流程

    最近任务太多了,肝哭我了,boom 参考书目:Thinking in Java <Java基础复习>-控制执行流程 Java使用了C的所有流程控制语句 涉及关键字:if-else.whil ...

随机推荐

  1. Rust中的derive属性详解

    1. Rust中的derive是什么? 在Rust语言中,derive是一个属性,它可以让编译器为一些特性提供基本的实现.这些特性仍然可以手动实现,以获得更复杂的行为. 2. derive的出现解决了 ...

  2. Redis性能瓶颈揭秘:如何优化大key问题?

    1. 什么是Redis大key问题 Redis大key问题指的是某个key对应的value值所占的内存空间比较大,导致Redis的性能下降.内存不足.数据不均衡以及主从同步延迟等问题. 到底多大的数据 ...

  3. 为什么 Go for-range 的 value 值地址每次都一样?

    原文链接: 为什么 Go for-range 的 value 值地址每次都一样? 循环语句是一种常用的控制结构,在 Go 语言中,除了 for 关键字以外,还有一个 range 关键字,可以使用 fo ...

  4. 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置

    目录 沁恒 CH32V208(一): CH32V208WBU6 评估板上手报告和Win10环境配置 CH32V208 CH32V208系列是沁恒32位RISC-V中比较新的一个系列, 基于青稞RISC ...

  5. Prism Sample 5 View Injection

    这里稍微复杂了点,定义视图A的过程是一样的: <UserControl x:Class="ViewInjection.Views.ViewA" xmlns="htt ...

  6. 2020-11-17:java中,吞吐量优先和响应时间优先的回收器是哪些?

    福哥答案2020-11-17:对于吞吐量优先的场景,就只有一种选择,就是使用 PS 组合(Parallel Scavenge+Parallel Old ).对于响应时间优先的场景,在 JDK1.8 的 ...

  7. 2022-05-03:Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第

    2022-05-03:Alice 和 Bob 再次设计了一款新的石子游戏.现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值.给你一个整数数组 stones ,其中 stones[i] 是第 ...

  8. ESLint: More than 1 blank line not allowed. (no-multiple-empty-lines)

    ESLint: More than 1 blank line not allowed. (no-multiple-empty-lines)

  9. 在Centos7上安装PXE装机环境来批量安装操作系统

    步骤 1:安装必要的软件包 首先,需要确保系统已安装 dhcp.tftp-server 和 httpd 等软件包.可以使用以下命令进行安装: yum install -y dhcp tftp-serv ...

  10. vue项目提示TypeError: e.call is not a function

    最近运行vue项目老是提示TypeError: e.call is not a function 如上一运行到该页面就会提示这个错误,虽然页面功能都没受到影响,但是这个必定会给后期发布后的项目带来极大 ...