>  기사  >  Java  >  Java에서 StringBuffer 클래스 사용에 대한 자세한 설명

Java에서 StringBuffer 클래스 사용에 대한 자세한 설명

高洛峰
高洛峰원래의
2017-01-22 09:15:291559검색

StringBuffer는 스레드로부터 안전한 변경 가능한 문자 시퀀스입니다. AbstractStringBuilder를 상속하고 CharSequence 인터페이스를 구현합니다.
StringBuilder는 AbstractStringBuilder에서 상속된 하위 클래스이기도 합니다. 그러나 StringBuilder는 StringBuffer와 다릅니다. 전자는 스레드로부터 안전하지 않습니다.
StringBuffer와 CharSequence의 관계 다이어그램은 다음과 같습니다.

Java에서 StringBuffer 클래스 사용에 대한 자세한 설명

StringBuffer 클래스는 String과 동일하며 문자열을 표현하는 데도 사용되지만 내부 구현이 다르기 때문입니다. StringBuffer는 String Different와 유사하므로 StringBuffer는 문자열을 처리할 때 새 개체를 생성하지 않으며 메모리 사용량이 String 클래스보다 좋습니다.
그래서 실제 사용 시 문자열 삽입, 삭제 등 문자열을 자주 수정해야 하는 경우에는 StringBuffer를 사용하는 것이 더 적합합니다.
StringBuffer 클래스에는 String 클래스와 동일한 메서드가 많이 있습니다. 이러한 메서드는 String 클래스의 메서드와 기능적으로 동일합니다.
그러나 가장 중요한 차이점 중 하나는 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 중국어 웹사이트를 참고하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.