服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java 基础复习——StringBuffer 和 StringBuilder

Java 基础复习——StringBuffer 和 StringBuilder

2023-08-21 01:22未知服务器之家 Java教程

StringBuffer 和 StringBuilder StringBuffer 类 简介 java.lang.StringBuffer 代表可变的字符序列,可以对字符串内容进行增删 很多方法和 String 相同,但 StringBuffer 是可变长度的 StringBuffer 是一个容器 注意: StringBuffer 的直接父类是 AbstractStringBu

StringBuffer 和 StringBuilder

StringBuffer 类 简介

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

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

  • StringBuffer 是一个容器

Java 基础复习——StringBuffer 和 StringBuilder

注意:

  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 要快。两者的方法基本相同

Java 基础复习——StringBuffer 和 StringBuilder

注意:

  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教程简单讲解在Java编程中实现设计模式中的单例模式结构

    简单讲解在Java编程中实现设计模式中的单例模式结构

    这篇文章主要介绍了简单讲解在Java编程中实现设计模式中的单例模式结构,设计模式是最基本直白简单的一种设计模式,需要的朋友可以参考下 ...

    匆忙拥挤repeat2622020-04-19
  • Java教程Maven默认中央仓库(settings.xml 配置详解)

    Maven默认中央仓库(settings.xml 配置详解)

    这篇文章主要介绍了Maven默认中央仓库(settings.xml 配置详解),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    低至一折起10282021-03-05
  • Java教程2个java希尔排序示例

    2个java希尔排序示例

    java希尔排序示例,希尔排序是插入排序的一种类型,也可以用一个形象的叫法缩小增量法,需要的朋友可以参考下 ...

    Java教程网4062019-11-22
  • Java教程java去除重复对象的简单实例

    java去除重复对象的简单实例

    下面小编就为大家带来一篇java去除重复对象的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    java教程网3622020-07-25
  • Java教程为了多次读取ServletInputStream引发的一系列问题

    为了多次读取ServletInputStream引发的一系列问题

    这篇文章主要介绍了为了多次读取ServletInputStream引发的一系列问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐...

    JAVA道人12022022-02-28
  • Java教程Java中让界面内的时间及时更新示例代码

    Java中让界面内的时间及时更新示例代码

    这篇文章主要给大家介绍了关于Java中让界面内的时间及时更新的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习...

    低脂肪4702020-09-03
  • Java教程详解Java反射实现Aop代理

    详解Java反射实现Aop代理

    本篇文章主要介绍了Java 反射实现 Aop 代理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    小小俊子3242020-09-02
  • Java教程Java的递归算法详解

    Java的递归算法详解

    Java递归算法是基于Java语言实现的递归算法。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。接下来通过本文给大家介绍Java递归算法相...

    Craftsman-L6822021-12-27