Heim >Java >javaLernprogramm >Detaillierte Erläuterung der Verwendung der StringBuffer-Klasse in Java
StringBuffer ist eine threadsichere veränderbare Zeichenfolge. Es erbt von AbstractStringBuilder und implementiert die CharSequence-Schnittstelle.
StringBuilder ist ebenfalls eine von AbstractStringBuilder geerbte Unterklasse. StringBuilder unterscheidet sich jedoch von StringBuffer. Ersteres ist nicht threadsicher und letzteres ist threadsicher.
Das Beziehungsdiagramm zwischen StringBuffer und CharSequence lautet wie folgt:
Die StringBuffer-Klasse ist dieselbe wie String und wird auch zur Darstellung von Zeichenfolgen verwendet, jedoch aufgrund der internen Implementierung von StringBuffer ähnelt String Different, sodass StringBuffer bei der Verarbeitung von Zeichenfolgen keine neuen Objekte generiert und seine Speichernutzung besser ist als die der String-Klasse.
Wenn Sie also im tatsächlichen Gebrauch häufig eine Zeichenfolge ändern müssen, z. B. Einfügen, Löschen usw., ist die Verwendung von StringBuffer besser geeignet.
Es gibt viele Methoden in der StringBuffer-Klasse, die mit denen in der String-Klasse identisch sind. Diese Methoden sind funktional identisch mit denen in der String-Klasse.
Aber einer der bedeutendsten Unterschiede besteht darin, dass jede Änderung am StringBuffer-Objekt das Objekt selbst verändert. Dies ist der größte Unterschied zur String-Klasse.
Da StringBuffer außerdem threadsicher ist, wird das Konzept von Threads später in einem speziellen Kapitel vorgestellt, sodass es auch problemlos in Multithread-Programmen verwendet werden kann, die Ausführungseffizienz des Programms jedoch relativ niedrig.
0. Initialisierung des StringBuffer-Objekts
Die Initialisierung des StringBuffer-Objekts ist nicht dasselbe wie die Initialisierung der String-Klasse, und normalerweise wird der Konstruktor für die Initialisierung verwendet.
Zum Beispiel:
StringBuffer s = new StringBuffer();
Das auf diese Weise initialisierte StringBuffer-Objekt ist ein leeres Objekt.
Wenn Sie ein StringBuffer-Objekt mit Inhalt erstellen müssen, können Sie Folgendes verwenden:
StringBuffer s = new StringBuffer(“abc”);
Der Inhalt des auf diese Weise initialisierten StringBuffer-Objekts ist die Zeichenfolge „abc“.
Es ist zu beachten, dass StringBuffer und String unterschiedliche Typen sind und nicht direkt umgewandelt werden können. Die folgenden Codes sind falsch:
StringBuffer s = “abc”; //赋值类型不匹配 StringBuffer s = (StringBuffer)”abc”; //不存在继承关系,无法进行强转
StringBuffer-Objekt und Der Code für die gegenseitige Konvertierung zwischen String-Objekte lauten wie folgt:
String s = “abc”; StringBuffer sb1 = new StringBuffer(“123”); StringBuffer sb2 = new StringBuffer(s); //String转换为StringBuffer String s1 = sb1.toString(); //StringBuffer转换为String
1. StringBuffer-Funktionsliste
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-Beispiel
Die Quelle Der Code lautet wie folgt (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, 'M'); 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[]{'a','b','c','d','e'}); // 在位置0处插入字符数组。0表示字符数组起始位置,3表示长度 sbuilder.insert(0, new char[]{'A','B','C','D','E'}, 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, '\n'); // 在位置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, '\n'); // 在位置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[]{'a','b','c','d','e'}); // 追加字符数组。0表示字符数组起始位置,3表示长度 sbuilder.append(new char[]{'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(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('\n'); // 追加Object对象。此处以HashMap为例 HashMap map = new HashMap(); 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); } }
Laufendes Ergebnis:
-------------------------------- 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
Ausführlichere Erläuterungen zur Verwendung der StringBuffer-Klasse in Java finden Sie auf der chinesischen PHP-Website!