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. pysimplegui之元素常用属性

    常用元素参数 您将在几乎所有元素创建调用中看到的一些参数包括: key - 与 window[key].事件和返回值字典一起使用 工具提示tooltip - 将鼠标悬停在元素上,您将获得包含此文本的弹 ...

  2. Redis集群介绍及测试思路

    作者:京东零售 李磊 Redis集群介绍 Redis集群一般有四种方式,分别为:主从复制.哨兵模式.Cluster以及各大厂的集群方案.在3.0版本之前只支持单实例模式,3.0之后支持了集群方式.在3 ...

  3. [数据库]MySQL之备份与恢复【未完待续】

    1 恢复 方式一 source sqlFile.sql 登陆MySQL 创建数据库db (create database db;) 进入/使用 数据库db (use db;) 将要导入的sql文件放到 ...

  4. 打造自己的ChatGPT:OpenAI的API接入技巧

    打造自己的ChatGPT:OpenAI 的API接入技巧 2023年3月更新 OpenAI 在3月1日的时候放出了ChatGPT的接口,新的接口可以使用 GPT-3.5 模型,同时接口参数更新为了 m ...

  5. Go语言实战: 即时通信系统(未完)

    使用Go语言构建一个即时通信系统,旨在锻炼Go语言编程能力 该通信系统至少能够允许用户能够在客户端进行公聊,即所发消息能被所有用户看到,也可发起私聊(即两个用户之间私密通信).同时,用户能够看到当前有 ...

  6. 从 API 网关聊到 API 管理

    在 API 管理中,通常会有这些痛点: 1.企业不清楚到底有多少个API,无法形成API资产管理等问题. 2.API在不同集群的生命周期问题. 3.API运行状态监控和告警问题. 4.API请求限流. ...

  7. OpenFec介绍

    官网: http://openfec.org/accueil.html   1.提供的编解码器 Reed-Solomon stable codec over GF(28)                ...

  8. JavaScript中的四种枚举方式

    字符串和数字具有无数个值,而其他类型如布尔值则是有限的集合. 一周的日子(星期一,星期二,...,星期日),一年的季节(冬季,春季,夏季,秋季)和基本方向(北,东,南,西)都是具有有限值集合的例子. ...

  9. 【HTML-CSS】div中加入icon后input标签占用不满问题

    做登录表单时遇到了一个宽度控制不好的问题,放入图标后,input框总是无法正确的填满剩余空间(尺寸过大/过小) 原因是input元素和父元素div宽度都写死的问题 把父元素的高度删除,宽度改成max- ...

  10. 使用NineData定制企业级数据库规范

    1. 为什么需要数据库规范? 在企业级应用中,数据库是非常重要的一部分,它们存储着公司的核心数据,包括客户信息.订单.产品信息等等.如果这些数据没有得到妥善的管理,那么就会导致数据不一致.数据丢失.数 ...