ホームページ  >  記事  >  Java  >  JavaのStringBufferクラスの使い方を詳しく解説

JavaのStringBufferクラスの使い方を詳しく解説

高洛峰
高洛峰オリジナル
2017-01-22 09:15:291624ブラウズ

StringBuffer は、スレッドセーフな変更可能な文字シーケンスです。 AbstractStringBuilder を継承し、CharSequence インターフェイスを実装します。
StringBuilder も AbstractStringBuilder から継承されたサブクラスですが、StringBuilder は非スレッド セーフであり、後者はスレッド セーフです。
StringBuffer と CharSequence の関係図は次のとおりです。

JavaのStringBufferクラスの使い方を詳しく解説

StringBuffer クラスは String と同じで、文字列を表すためにも使用されます。ただし、StringBuffer の内部実装は String とは異なるため、StringBuffer は機能しません。文字列を処理する場合、メモリ使用量の点では、新しいオブジェクトを生成する方が String クラスよりも優れています。
そのため、実際の使用において、頻繁に文字列の挿入や削除などの変更が必要な場合には、StringBuffer を使用する方が適しています。
StringBuffer クラスには、String クラスのメソッドと同じメソッドが多数あります。これらのメソッドは、String クラスのメソッドと機能的に同一です。
しかし、最も重要な違いの 1 つは、StringBuffer オブジェクトを変更するとオブジェクト自体が変更されることです。これが String クラスとの最大の違いです。

さらに、StringBuffer はスレッドセーフであるため、スレッドの概念は後ほど特別な章で紹介します。そのため、マルチスレッド プログラムでも簡単に使用できますが、プログラムの実行効率は比較的遅くなります。

0. StringBuffer オブジェクトの初期化

StringBuffer オブジェクトの初期化は String クラスの初期化とは異なり、通常はコンストラクター メソッドが初期化に使用されます。
例:

StringBuffer s = new StringBuffer();

この方法で初期化された StringBuffer オブジェクトは空のオブジェクトです。
コンテンツを含む StringBuffer オブジェクトを作成する必要がある場合は、以下を使用できます:

StringBuffer s = new StringBuffer(“abc”);

初期化された StringBuffer オブジェクトのコンテンツは文字列「abc」です。
StringBuffer と String は異なる型に属しており、次のコードは間違っています:

StringBuffer s = “abc”;        //赋值类型不匹配
StringBuffer s = (StringBuffer)”abc”;  //不存在继承关系,无法进行强转

StringBuffer オブジェクトと String オブジェクト間の相互変換のコードは次のとおりです。

String s = “abc”;
StringBuffer sb1 = new StringBuffer(“123”);
StringBuffer sb2 = new StringBuffer(s);  //String转换为StringBuffer
String s1 = sb1.toString();       //StringBuffer转换为String

1. StringBuffer 関数リスト

StringBuffer()
StringBuffer(int capacity)
StringBuffer(String string)
StringBuffer(CharSequence cs)
 
StringBuffer  append(boolean b)
StringBuffer  append(int i)
StringBuffer  append(long l)
StringBuffer  append(float f)
StringBuffer  append(double d)
synchronized StringBuffer  append(char ch)
synchronized StringBuffer  append(char[] chars)
synchronized StringBuffer  append(char[] chars, int start, int length)
synchronized StringBuffer  append(Object obj)
synchronized StringBuffer  append(String string)
synchronized StringBuffer  append(StringBuffer sb)
synchronized StringBuffer  append(CharSequence s)
synchronized StringBuffer  append(CharSequence s, int start, int end)
StringBuffer  appendCodePoint(int codePoint)
int  capacity()
synchronized char  charAt(int index)
synchronized int  codePointAt(int index)
synchronized int  codePointBefore(int index)
synchronized int  codePointCount(int beginIndex, int endIndex)
synchronized StringBuffer  delete(int start, int end)
synchronized StringBuffer  deleteCharAt(int location)
synchronized void  ensureCapacity(int min)
synchronized void  getChars(int start, int end, char[] buffer, int idx)
synchronized int  indexOf(String subString, int start)
int  indexOf(String string)
StringBuffer  insert(int index, boolean b)
StringBuffer  insert(int index, int i)
StringBuffer  insert(int index, long l)
StringBuffer  insert(int index, float f)
StringBuffer  insert(int index, double d)
synchronized StringBuffer  insert(int index, char ch)
synchronized StringBuffer  insert(int index, char[] chars)
synchronized StringBuffer  insert(int index, char[] chars, int start, int length)
synchronized StringBuffer  insert(int index, String string)
StringBuffer  insert(int index, Object obj)
synchronized StringBuffer  insert(int index, CharSequence s)
synchronized StringBuffer  insert(int index, CharSequence s, int start, int end)
int  lastIndexOf(String string)
synchronized int  lastIndexOf(String subString, int start)
int  length()
synchronized int  offsetByCodePoints(int index, int codePointOffset)
synchronized StringBuffer  replace(int start, int end, String string)
synchronized StringBuffer  reverse()
synchronized void  setCharAt(int index, char ch)
synchronized void  setLength(int length)
synchronized CharSequence  subSequence(int start, int end)
synchronized String  substring(int start)
synchronized String  substring(int start, int end)
synchronized String  toString()
synchronized void  trimToSize()

2. StringBuffer のソースコードは次のとおりです (StringBufferTest.java):

/**
 * StringBuffer 演示程序
 */
import java.util.HashMap;
 
public class StringBufferTest {
 
 public static void main(String[] args) {
  testInsertAPIs() ;
  testAppendAPIs() ;
  testReplaceAPIs() ;
  testDeleteAPIs() ;
  testIndexAPIs() ;
  testOtherAPIs() ;
 }
 
 /**
  * StringBuffer 的其它API示例
  */
 private static void testOtherAPIs() {
 
  System.out.println("-------------------------------- testOtherAPIs --------------------------------");
 
  StringBuffer sbuilder = new StringBuffer("0123456789");
 
  int cap = sbuilder.capacity();
  System.out.printf("cap=%d\n", cap);
 
  char c = sbuilder.charAt(6);
  System.out.printf("c=%c\n", c);
 
  char[] carr = new char[4];
  sbuilder.getChars(3, 7, carr, 0);
  for (int i=0; i<carr.length; i++)
   System.out.printf("carr[%d]=%c ", i, carr[i]);
  System.out.println();
 
  System.out.println();
 }
 
 /**
  * StringBuffer 中index相关API演示
  */
 private static void testIndexAPIs() {
  System.out.println("-------------------------------- testIndexAPIs --------------------------------");
 
  StringBuffer sbuilder = new StringBuffer("abcAbcABCabCaBcAbCaBCabc");
  System.out.printf("sbuilder=%s\n", sbuilder);
 
  // 1. 从前往后,找出"bc"第一次出现的位置
  System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\")", sbuilder.indexOf("bc"));
 
  // 2. 从位置5开始,从前往后,找出"bc"第一次出现的位置
  System.out.printf("%-30s = %d\n", "sbuilder.indexOf(\"bc\", 5)", sbuilder.indexOf("bc", 5));
 
  // 3. 从后往前,找出"bc"第一次出现的位置
  System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\")", sbuilder.lastIndexOf("bc"));
 
  // 4. 从位置4开始,从后往前,找出"bc"第一次出现的位置
  System.out.printf("%-30s = %d\n", "sbuilder.lastIndexOf(\"bc\", 4)", sbuilder.lastIndexOf("bc", 4));
 
  System.out.println();
 }
 
 /**
  * StringBuffer 的replace()示例
  */
 private static void testReplaceAPIs() {
 
  System.out.println("-------------------------------- testReplaceAPIs ------------------------------");
 
  StringBuffer sbuilder;
 
  sbuilder = new StringBuffer("0123456789");
  sbuilder.replace(0, 3, "ABCDE");
  System.out.printf("sbuilder=%s\n", sbuilder);
 
  sbuilder = new StringBuffer("0123456789");
  sbuilder.reverse();
  System.out.printf("sbuilder=%s\n", sbuilder);
 
  sbuilder = new StringBuffer("0123456789");
  sbuilder.setCharAt(0, &#39;M&#39;);
  System.out.printf("sbuilder=%s\n", sbuilder);
 
  System.out.println();
 }
 
 /**
  * StringBuffer 的delete()示例
  */
 private static void testDeleteAPIs() {
 
  System.out.println("-------------------------------- testDeleteAPIs -------------------------------");
 
  StringBuffer sbuilder = new StringBuffer("0123456789");
 
  // 删除位置0的字符,剩余字符是“123456789”。
  sbuilder.deleteCharAt(0);
  // 删除位置3(包括)到位置6(不包括)之间的字符,剩余字符是“123789”。
  sbuilder.delete(3,6);
 
  // 获取sb中从位置1开始的字符串
  String str1 = sbuilder.substring(1);
  // 获取sb中从位置3(包括)到位置5(不包括)之间的字符串
  String str2 = sbuilder.substring(3, 5);
  // 获取sb中从位置3(包括)到位置5(不包括)之间的字符串,获取的对象是CharSequence对象,此处转型为String
  String str3 = (String)sbuilder.subSequence(3, 5);
 
  System.out.printf("sbuilder=%s\nstr1=%s\nstr2=%s\nstr3=%s\n",
    sbuilder, str1, str2, str3);
 
  System.out.println();
 }
 
 /**
  * StringBuffer 的insert()示例
  */
 private static void testInsertAPIs() {
 
  System.out.println("-------------------------------- testInsertAPIs -------------------------------");
 
  StringBuffer sbuilder = new StringBuffer();
 
  // 在位置0处插入字符数组
  sbuilder.insert(0, new char[]{&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;});
  // 在位置0处插入字符数组。0表示字符数组起始位置,3表示长度
  sbuilder.insert(0, new char[]{&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;}, 0, 3);
  // 在位置0处插入float
  sbuilder.insert(0, 1.414f);
  // 在位置0处插入double
  sbuilder.insert(0, 3.14159d);
  // 在位置0处插入boolean
  sbuilder.insert(0, true);
  // 在位置0处插入char
  sbuilder.insert(0, &#39;\n&#39;);
  // 在位置0处插入int
  sbuilder.insert(0, 100);
  // 在位置0处插入long
  sbuilder.insert(0, 12345L);
  // 在位置0处插入StringBuilder对象
  sbuilder.insert(0, new StringBuffer("StringBuilder"));
  // 在位置0处插入StringBuilder对象。6表示被在位置0处插入对象的起始位置(包括),13是结束位置(不包括)
  sbuilder.insert(0, new StringBuffer("STRINGBUILDER"), 6, 13);
  // 在位置0处插入StringBuffer对象。
  sbuilder.insert(0, new StringBuffer("StringBuffer"));
  // 在位置0处插入StringBuffer对象。6表示被在位置0处插入对象的起始位置(包括),12是结束位置(不包括)
  sbuilder.insert(0, new StringBuffer("STRINGBUFFER"), 6, 12);
  // 在位置0处插入String对象。
  sbuilder.insert(0, "String");
  // 在位置0处插入String对象。1表示被在位置0处插入对象的起始位置(包括),6是结束位置(不包括)
  sbuilder.insert(0, "0123456789", 1, 6);
  sbuilder.insert(0, &#39;\n&#39;);
 
  // 在位置0处插入Object对象。此处以HashMap为例
  HashMap map = new HashMap();
  map.put("1", "one");
  map.put("2", "two");
  map.put("3", "three");
  sbuilder.insert(0, map);
 
  System.out.printf("%s\n\n", sbuilder);
 }
 
 /**
  * StringBuffer 的append()示例
  */
 private static void testAppendAPIs() {
 
  System.out.println("-------------------------------- testAppendAPIs -------------------------------");
 
  StringBuffer sbuilder = new StringBuffer();
 
  // 追加字符数组
  sbuilder.append(new char[]{&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;});
  // 追加字符数组。0表示字符数组起始位置,3表示长度
  sbuilder.append(new char[]{&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;}, 0, 3);
  // 追加float
  sbuilder.append(1.414f);
  // 追加double
  sbuilder.append(3.14159d);
  // 追加boolean
  sbuilder.append(true);
  // 追加char
  sbuilder.append(&#39;\n&#39;);
  // 追加int
  sbuilder.append(100);
  // 追加long
  sbuilder.append(12345L);
  // 追加StringBuilder对象
  sbuilder.append(new StringBuffer("StringBuilder"));
  // 追加StringBuilder对象。6表示被追加对象的起始位置(包括),13是结束位置(不包括)
  sbuilder.append(new StringBuffer("STRINGBUILDER"), 6, 13);
  // 追加StringBuffer对象。
  sbuilder.append(new StringBuffer("StringBuffer"));
  // 追加StringBuffer对象。6表示被追加对象的起始位置(包括),12是结束位置(不包括)
  sbuilder.append(new StringBuffer("STRINGBUFFER"), 6, 12);
  // 追加String对象。
  sbuilder.append("String");
  // 追加String对象。1表示被追加对象的起始位置(包括),6是结束位置(不包括)
  sbuilder.append("0123456789", 1, 6);
  sbuilder.append(&#39;\n&#39;);
 
  // 追加Object对象。此处以HashMap为例
  HashMap map = new HashMap();
  map.put("1", "one");
  map.put("2", "two");
  map.put("3", "three");
  sbuilder.append(map);
  sbuilder.append(&#39;\n&#39;);
 
  // 追加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);
 }
}

実行結果:

-------------------------------- testInsertAPIs -------------------------------
{3=three, 2=two, 1=one}
12345StringBUFFERStringBufferBUILDERStringBuilder12345100
true3.141591.414ABCabcde
 
-------------------------------- testAppendAPIs -------------------------------
abcdeABC1.4143.14159true
10012345StringBuilderBUILDERStringBufferBUFFERString12345
{3=three, 2=two, 1=one}
字符编码
 
-------------------------------- testReplaceAPIs ------------------------------
sbuilder=ABCDE3456789
sbuilder=9876543210
sbuilder=M123456789
 
-------------------------------- testDeleteAPIs -------------------------------
sbuilder=123789
str1=23789
str2=78
str3=78
 
-------------------------------- testIndexAPIs --------------------------------
sbuilder=abcAbcABCabCaBcAbCaBCabc
sbuilder.indexOf("bc")   = 1
sbuilder.indexOf("bc", 5)  = 22
sbuilder.lastIndexOf("bc")  = 22
sbuilder.lastIndexOf("bc", 4) = 4
 
-------------------------------- testOtherAPIs --------------------------------
cap=26
c=6
carr[0]=3 carr[1]=4 carr[2]=5 carr[3]=6

さらに詳しい説明Java の文字 StringBuffer クラスの使用に関する記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。