stringBuffer、stringBuilder

简介: stringBuffer

常用方法

1、insert

privatestaticvoidtestInsertAPIs(){

   System.out.println("---------- testInsertAPIs -----------");

   StringBuildersbuilder=newStringBuilder();

   // 在位置0处插入字符数组

   sbuilder.insert(0, newchar[]{'a', 'b', 'c', 'd', 'e'}); // abcde

   // 在位置0处插入字符数组。0表示字符数组起始位置,3表示长度

   sbuilder.insert(0, newchar[]{'A', 'B', 'C', 'D', 'E'}, 0, 3); // ABCabcde

   // 在位置0处插入float

   sbuilder.insert(0, 1.414f); // 1.414ABCabcde

   // 在位置0处插入double

   sbuilder.insert(0, 3.14159d);

   // 在位置0处插入boolean

   sbuilder.insert(0, true);

   // 在位置0处插入char

   sbuilder.insert(0, '\n');

   // 在位置0处插入int

   sbuilder.insert(0, 100);

   // 在位置0处插入long

   sbuilder.insert(0, 12345L);

   // 在位置0处插入StringBuilder对象

   sbuilder.insert(0, newStringBuilder("StringBuilder"));

   // 在位置0处插入StringBuilder对象。6表示被在位置0处插入对象的起始位置(包括),13是结束位置(不包括)

   sbuilder.insert(0, newStringBuilder("STRINGBUILDER"), 6, 13);

   // 在位置0处插入StringBuffer对象。

   sbuilder.insert(0, newStringBuffer("StringBuffer"));

   // 在位置0处插入StringBuffer对象。6表示被在位置0处插入对象的起始位置(包括),12是结束位置(不包括)

   sbuilder.insert(0, newStringBuffer("STRINGBUFFER"), 6, 12);

   // 在位置0处插入String对象。

   sbuilder.insert(0, "String");

   // 在位置0处插入String对象。1表示被在位置0处插入对象的起始位置(包括),6是结束位置(不包括)

   sbuilder.insert(0, "0123456789", 1, 6);

   sbuilder.insert(0, '\n');

   // 在位置0处插入Object对象。此处以HashMap为例

   HashMapmap=newHashMap();

   map.put("1", "one");

   map.put("2", "two");

   map.put("3", "three");

   sbuilder.insert(0, map);

   System.out.printf("%s\n\n", sbuilder);

}

2、append

/**

* StringBuilder 的append()示例

*/

privatestaticvoidtestAppendAPIs() {

   System.out.println("------------------- testAppendAPIs -----------------

   --");

   StringBuildersbuilder=newStringBuilder();

   // 追加字符数组

   sbuilder.append(newchar[]{'a','b','c','d','e'});

   // 追加字符数组。0表示字符数组起始位置,3表示长度

   sbuilder.append(newchar[]{'A','B','C','D','E'}, 0, 3);

   // 追加float

   sbuilder.append(1.414f);

   // 追加double

   sbuilder.append(3.14159d);

   // 追加boolean

   sbuilder.append(true);

   // 追加char

   sbuilder.append('\n');

   // 追加int

   sbuilder.append(100);

   // 追加long

   sbuilder.append(12345L);

   // 追加StringBuilder对象

   sbuilder.append(newStringBuilder("StringBuilder"));

   // 追加StringBuilder对象。6表示被追加对象的起始位置(包括),13是结束位置(不包括)

   sbuilder.append(newStringBuilder("STRINGBUILDER"), 6, 13);

   // 追加StringBuffer对象。

   sbuilder.append(newStringBuffer("StringBuffer"));

   // 追加StringBuffer对象。6表示被追加对象的起始位置(包括),12是结束位置(不包括)

   sbuilder.append(newStringBuffer("STRINGBUFFER"), 6, 12);

   // 追加String对象。

   sbuilder.append("String");

   // 追加String对象。1表示被追加对象的起始位置(包括),6是结束位置(不包括)

   sbuilder.append("0123456789", 1, 6);

   sbuilder.append('\n');

   // 追加Object对象。此处以HashMap为例

   HashMapmap=newHashMap();

   map.put("1", "one");

   map.put("2", "two");

   map.put("3", "three");

   sbuilder.append(map);

   sbuilder.append('\n');

   // 追加unicode编码

   sbuilder.appendCodePoint(0x5b57); // 0x5b57是“字”的unicode编码

   sbuilder.appendCodePoint(0x7b26); // 0x7b26是“符”的unicode编码

   sbuilder.appendCodePoint(0x7f16); // 0x7f16是“编”的unicode编码

   sbuilder.appendCodePoint(0x7801); // 0x7801是“码”的unicode编码

   System.out.printf("%s\n\n", sbuilder);

}

3、replace

reverse():反转

replace(start,end,str):从[start,end)替换str

setCharAt(n, ch):在位置n上设置字符ch

/**

* StringBuilder 的replace()示例

*/

privatestaticvoidtestReplaceAPIs() {

   System.out.println("------------------- testReplaceAPIs-------------------");

   StringBuildersbuilder;

   sbuilder=newStringBuilder("0123456789");

   sbuilder.replace(0, 3, "ABCDE"); // [0,3)

     

   System.out.printf("sbuilder=%s\n", sbuilder);// sbuilder=ABCDE3456789

   sbuilder=newStringBuilder("0123456789");

   sbuilder.reverse();

   System.out.printf("sbuilder=%s\n", sbuilder);// 9876543210

   sbuilder=newStringBuilder("0123456789");

   sbuilder.setCharAt(0, 'M');

   System.out.printf("sbuilder=%s\n", sbuilder);// M123456789

   System.out.println();

}

4、delete

  • deleteCharAt(n):删除位置n上的字符
  • delete(start,end):删除字符[start,end)
  • substring(n):获取从位置n开始的字符串
  • substring(start,end):获取从[start,end)的字符串
  • subSequence(start,end):获取从[start,end)的字符串(CharSequence对象)

 

privatestaticvoidtestDeleteAPIs() {

   System.out.println("------------------- testDeleteAPIs -------------------");

   StringBuildersbuilder=newStringBuilder("0123456789");

   // 删除位置0的字符,剩余字符是“123456789”。

   sbuilder.deleteCharAt(0);

   // 删除位置3(包括)到位置6(不包括)之间的字符,剩余字符是“123789”。

   sbuilder.delete(3,6);

   // 获取sb中从位置1开始的字符串

   Stringstr1=sbuilder.substring(1);

   // 获取sb中从位置3(包括)到位置5(不包括)之间的字符串

   Stringstr2=sbuilder.substring(3, 5);

   // 获取sb中从位置3(包括)到位置5(不包括)之间的字符串,获取的对象是CharSequence对象,此处转型为String

   Stringstr3= (String)sbuilder.subSequence(3, 5);

   System.out.printf("sbuilder=%s\nstr1=%s\nstr2=%s\nstr3=%s\n",

   sbuilder, str1, str2, str3);

}

5、index

indexof(str):找到字符串str第一次出现的下标

indexof(str,n):找到字符串str第一次出现的下标,从n开始

lastIndexof(str):从后往前,找到字符串str第一次出现的下标

lastIndexof(str,n):从后往前,找到字符串str第一次出现的下标,从n开始

/**

* StringBuilder 中index相关API演示

*/

privatestaticvoidtestIndexAPIs() {

   System.out.println("-------------------------------- testIndexAPIs --------------------------------");

   StringBuildersbuilder=newStringBuilder("abcAbcABCabCaBcAbCaBCabc");

   System.out.printf("sbuilder=%s\n", sbuilder);

   // 1. 从前往后,找出"bc"第一次出现的位置 1

   System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\")",

   sbuilder.indexOf("bc"));

   // 2. 从位置5开始,从前往后,找出"bc"第一次出现的位置 22

   System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\", 5)",

   sbuilder.indexOf("bc", 5));

   // 3. 从后往前,找出"bc"第一次出现的位置 22

   System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\")",

   sbuilder.lastIndexOf("bc"));

   // 4. 从位置4开始,从后往前,找出"bc"第一次出现的位置 4

   System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\", 4)",

   sbuilder.lastIndexOf("bc", 4));

   System.out.println();

}

6、其他API

/**

* StringBuilder 的其它API示例

*/

privatestaticvoidtestOtherAPIs() {

   System.out.println("----------- testOtherAPIs -----------");

   StringBuildersbuilder=newStringBuilder("0123456789");

   intcap=sbuilder.capacity();

   System.out.printf("cap=%d\n", cap);

   /*

   capacity()返回的是字符串缓冲区的容量

   StringBuffer( ); 分配16个字符的缓冲区

   StringBuffer( int len ); 分配len个字符的缓冲区

   StringBuffer( String s ); 除了按照s的大小分配空间外,再分配16个 字符的缓冲区

   你的StringBuffer是用字符构造的,"0123456789"的长度是10另外再分配16个字符,所

   以一共是26。

   */

   charc=sbuilder.charAt(6);

   System.out.printf("c=%c\n", c);

   char[] carr=newchar[4];

   sbuilder.getChars(3, 7, carr, 0); // 将[3,7)的值,依次从下标0的位置上开始赋值

   for (inti=0; i<carr.length; i++){

   System.out.printf("carr[%d]=%c ", i, carr[i]);

   }

   System.out.println();

}

3、小结

  • String:字符串常量
  • StringBuffer:字符串变量(线程安全)
  • StringBuilder:字符串变量(非线程安全)
  • 执行速度方面:StringBuilder > StringBuffer > String

区别

  • String和StringBuffer类型的主要区别在于String是不可变的对象
  • 每次在对String更改之后其实等同于生成了一个新的String对象,然后再将指针指向新生成的String对象
  • 所以经常改变内容的字符串最好不要用String对象,因为每次生成对象都会对系统的性能产生影响,特别是内存中无引用对象变多了之后,JVM的GC垃圾回收器就会开始工作
  • 而StringBuffer类操作时就只是对其本身进行操作,而不是生成新的对象。经常改动字符串内容的时候推荐使用StringBuffer对象
    特殊情况:

StringS1=“Thisisonlya”+simple”+test”;

StringBufferSb=newStringBuilder(“Thisisonlya”).append(

simple”).append(test”);

/*

这里是因为JVM把S1看作This is only a simple test

如果拼接的字符串是来自其他的String对象,速度就没那么快了

*/

使用场景

  • 操作少量的数据用String
  • 单线程操作字符串缓冲区下操作大量数据(需要经常修改)用StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据(需要经常修改)用StringBuffer
  • StringBuilder提供与StringBuffer相同的API,通常被用做StringBuffer的简易替换(一般情况下都是单线程且StringBuilder的运行速度更快)

面试题

StringBuilder与StringBuffer的区别,StringBuilder和String的区别

  • StringBuilder的效率更高,线程不安全,StringBuilder线程安全,效率低
  • String是不可变的,StringBuilder是可变的
  • 如果只是简单使用,不需要对字符串进行频繁修改可以用String,反之就需要用StringBuilder(String会产生多余的字符串,占用内存空间)
相关文章
|
2月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
53 1
|
29天前
|
安全 Java
String、StringBuffer、StringBuilder的区别
这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。
String、StringBuffer、StringBuilder的区别
|
13天前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
31 5
|
1月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
2月前
|
安全 Java API
Java系类 之 String、StringBuffer和StringBuilder类的区别
这篇文章讨论了Java中`String`、`StringBuffer`和`StringBuilder`三个类的区别,其中`String`是不可变的,而`StringBuffer`是线程安全的可变字符串类,`StringBuilder`是非线程安全的可变字符串类,通常在单线程环境下性能更优。
Java系类 之 String、StringBuffer和StringBuilder类的区别
|
2月前
|
安全 Java
【Java基础面试二十七】、说一说StringBuffer和StringBuilder有什么区别
这篇文章介绍了Java中StringBuffer和StringBuilder的区别:StringBuffer是线程安全的,而StringBuilder是非线程安全的,因此在单线程环境下优先推荐使用StringBuilder以获得更好的性能。
|
2月前
|
安全
String,Stringbuffer,StringBuilder的区别
【8月更文挑战第16天】String,Stringbuffer,StringBuilder的区别
31 2
|
2月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
87 0
|
2月前
|
缓存 安全 Java
【揭秘】String vs StringBuilder vs StringBuffer:三大字符串类的秘密较量!你真的知道何时该用哪个吗?
【8月更文挑战第19天】探讨Java中`String`、`StringBuilder`与`StringBuffer`的区别及应用场景。`String`不可变,适合做哈希表键或多线程共享。`StringBuilder`支持动态修改字符串,适用于单线程环境以提高性能。`StringBuffer`与`StringBuilder`功能相似,但线程安全。示例代码展示各类型的基本用法。选择哪种类型取决于具体需求和性能考量。
42 0
|
4月前
|
存储 缓存 Java
JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解
JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解
44 2