java 字符串緩沖區_詳解Java中字符串緩沖區StringBuffer類的使用

StringBuffer 是一個線程安全的可變的字符序列。它繼承于AbstractStringBuilder,實現了CharSequence接口。

StringBuilder 也是繼承于AbstractStringBuilder的子類;但是,StringBuilder和StringBuffer不同,前者是非線程安全的,后者是線程安全的。

StringBuffer 和 CharSequence之間的關系圖如下:

85d3a82b0cafc44cc7f321e9e9b12f65.png

StringBuffer類和String一樣,也用來代表字符串,只是由于StringBuffer的內部實現方式和String不同,所以StringBuffer在進行字符串處理時,不生成新的對象,在內存使用上要優于String類。

所以在實際使用時,如果經常需要對一個字符串進行修改,例如插入、刪除等操作,使用StringBuffer要更加適合一些。

在StringBuffer類中存在很多和String類一樣的方法,這些方法在功能上和String類中的功能是完全一樣的。

但是有一個最顯著的區別在于,對于StringBuffer對象的每次修改都會改變對象自身,這點是和String類最大的區別。

另外由于StringBuffer是線程安全的,關于線程的概念后續有專門的章節進行介紹,所以在多線程程序中也可以很方便的進行使用,但是程序的執行效率相對來說就要稍微慢一些。

0.StringBuffer對象的初始化

StringBuffer對象的初始化不像String類的初始化一樣,Java提供的有特殊的語法,而通常情況下一般使用構造方法進行初始化。

例如:

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

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);

}

}

運行結果:

-------------------------------- 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530152.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rabbitmq java文檔_RabbitMQ文檔翻譯——Hello World!(上)

文章主要翻譯自RabbitMQ官方文檔,主要是為了練習英語翻譯,順便學習一下RabbitMQ😶其中也記錄了一些爬過的坑IntroductionRabbitMQ is a message broker. The principal idea is pretty simple: it accepts and forwards messages. You can th…

java string 包含http_Java中使用HttpPost上傳文件以及HttpGet進行API請求(包含HttpPost上傳文件)...

一、HttpPost上傳文件public static String getSuffix(final MultipartFile file){if(file null || file.getSize() 0){return null;}String fileName file.getOriginalFilename();return fileName.substring(fileName.lastIndexOf(".")1);}public static JSONObj…

java倒計時跳出窗口_java倒計時彈出框

直接使用java語言寫出一個運行時的彈出框倒計時:package test.dagong.testDecreaseDate;import java.awt.Container;import java.awt.FlowLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.sw…

jpa mysql存儲過程_Jpa調用存儲過程及參數

public List findAllEntityListBySearch(Long inputInfoId, int flag) throws Exception {List infoviewListnew ArrayList<>();EntityManager em emf.createEntityManager();try {StoredProcedureQuery storedProcedure em.createStoredProcedureQuery("存儲名稱&…

python從mongodb里取出數據進行可視化_python3 mongoDB數據庫的安裝配置與可視化

python3 mongoDB數據庫的安裝配置與可視化。前天說是要學習如何使用mongoDB的鏈接與安裝。安裝環境&#xff1a; wind10 還是盜版的 磁盤分析&#xff1a;只有一個C盤&#xff0c;步驟&#xff1a;1 . 下載這里下載了對應的msi文件&#xff0c;貌似.zip文件沒有了2 我默認把mon…

idea 注入mapper報錯報紅的幾種解決方案

文章目錄 前言方法1&#xff1a;為 Autowired 注解設置required false方法2&#xff1a;用 Resource 替換 Autowired方法3&#xff1a;在Mapper接口上加上Repository注解方法4&#xff1a;用Lombok方法5&#xff1a;把IDEA的警告關閉掉方法6&#xff1a;不用管他 前言 相信大…

java 調用對象的方法_JAVA調用對象方法的執行過程

JAVA調用對象方法的執行過程&#xff1a;①.編譯器查看對象的聲明類型和方法名。假設調用x.f(parameter), 且隱式參數x聲明為C類型的對象&#xff0c;有可能在C對象中存在多個參數類型和參數個數不同的f的方法{例如&#xff1a;f(int)、f(int,String)和f(String)}&#xff0c;…

java類默認權限_Java 訪問權限控制以及類初始化順序

一. Package在一個項目中&#xff0c;不可以有相同的兩個包名package語句必須是文件中除注釋外第一句程序代碼&#xff0c;否則不能通過編譯。二. Java訪問權限概述類成員&#xff1a;對于一個類&#xff0c;其成員(包括成員變量和成員方法)能否被其他類所訪問&#xff0c;取決…

java http頭 字符串轉日期_springboot~DTO字符字段與日期字段的轉換問題

不會自動轉換string與date主要是這個意思&#xff0c;前端提交的JSON里&#xff0c;日期是一個字符串&#xff0c;而對應后端的實體里&#xff0c;它是一個Date的日期&#xff0c;這兩個在默認情況下是不能自動轉換的&#xff0c;我們先看一下實體實體public class UserDTO {pr…

java super extends_Java繼承和super的用法

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓繼承的關鍵字:extends格式如下: class 子類名 extends父類名{...}例如學生是繼承人類這一父類的.class student extends person{...}如果一個類的聲明沒有使用關鍵字extends,則這個類默認是繼承Object類的.Object是所有類的父類.Ob…

比較abc大小的java_比較abc大小java

比較abc大小java[2021-02-09 04:04:20] 簡介:php去除nbsp的方法&#xff1a;首先創建一個PHP代碼示例文件&#xff1b;然后通過“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推薦&#xff1a;《PH…

海天食品的java開發工作如何_再三個月就秋招了,我想找一份java開發工作,現在應該怎么準備一下?...

在找工作之前&#xff0c;大家都要做一些準備工作&#xff0c;java開發也是如此掌握核心JavaSE首先&#xff0c;從核心Java(JavaSE)開始學習&#xff0c;盡可能地掌握它。你應該了解和掌握一些基本概念&#xff0c;如循環&#xff0c;數組&#xff0c;運算符等等。此外&#xf…

java udp簡單聊天程序_Java基于UDP協議實現簡單的聊天室程序

最近比較閑&#xff0c;一直在抽空回顧一些java方面的技術應用。今天沒什么事做&#xff0c;基于udp協議&#xff0c;寫了一個非常簡單的聊天室程序。現在的工作&#xff0c;很少用到socket&#xff0c;也算是對java網絡編程方面的一個簡單回憶。先看一下效果&#xff1a;實現的…

java9 反應編程_Java9第四篇-Reactive Stream API響應式編程

file我計劃在后續的一段時間內&#xff0c;寫一系列關于java 9的文章&#xff0c;雖然java 9 不像Java 8或者Java 11那樣的核心java版本&#xff0c;但是還是有很多的特性值得關注。期待您能關注我&#xff0c;我將把java 9 寫成一系列的文章&#xff0c;大概十篇左右。Java 9的…

bb10系統支持java嗎_黑莓BB10怎么樣 BlackBerry 10系統好用嗎?

曾幾何時黑莓Blackberry OS是一款十分受用戶歡迎的手機系統&#xff0c;不過隨著手機系統市場已經被蘋果iOS、谷歌安卓、微軟Windows Phone三分天下&#xff0c;致使曾經的黑莓帝國逐漸淪陷&#xff0c;體驗和性能都已經明顯跟不上iOS與安卓等系統的腳步了&#xff0c;也因為如…

java中興參與實參相同_中興通訊_傳輸SDH試題(含答案)

中興傳輸SDH試題一、單項選擇題(每小題2分&#xff0c;共30分)1、在SDH系統中, RSOH指(A)。A.再生段開銷B.復用段開銷C.再生段通道開銷D.復用段通道開銷2.、同步數字體系SDH具有(A)幀結構。A.塊狀B.串行C.鏈形D.三維3、管理指針單元的作用是(A)。A、用來指示信息凈負荷的第一個…

php 正則提取url,php 正則表達式提取網頁超級鏈接url的函數

function match_links($document) {preg_match_all("]))[^>]*>?(.*?)isx",$document,$links);while(list($key,$val) each($links[2])) {if(!empty($val))$match[link][] $val;}while(list($key,$val) each($links[3])) {if(!empty($val))$match[link][] …

php array colum,php5.5新數組函數array_column使用

array_column 用于獲取二維數組中的元素(PHP 5 > 5.5.0)&#xff0c;但我們有時候需要在低版本中使用&#xff0c;那么就可以使用下面的代碼即可PHP5.5發布了&#xff0c;其中增加了一個新的數組函數array_column&#xff0c;感覺不錯的&#xff01;但是低版本PHP要使用&…

php 將字符串打亂,PHP內部實現打亂字符串順序函數str_shuffle的方法

前言2019年春節已過&#xff0c;今天是上班第一天&#xff0c;還得翻一翻之前沒有看完的PHP源碼。今天聊的是字符串順序打亂函數str_shuffle。這個函數本身使用頻率并不高。但是&#xff0c;其內部實現還是非常有趣的。str_shuffle() 函數隨機地打亂字符串中的所有字符。要注意…

php+js+return+true,js中return、return false、return true的區別

1.語法及返回方式①返回控制與函數結果語法為:return 表達式;語句結果函數的執行,返回調用函數,而且把表達式的值作為函數結果返回出去②返回控制無函數結果語法為:return;在大多數情況下,為事件處理函數如果讓其返回false,可以防止默認的事件行為.例如,默認情況下,點擊一個標簽…