字元串緩存
A. 舉例說明java中字元串和字元串緩沖區的區別
1.三者在執行速度方面的比較:StringBuilder > StringBuffer > String
2.String <(StringBuffer,StringBuilder)的原因
String:字元串常量
StringBuffer:字元創變數
StringBuilder:字元創變數
從上面的名字可以看到,String是「字元創常量」,也就是不可改變的對象。對於這句話的理解你可能會產生這樣一個疑問 ,比如這段代碼:
1 String s = "abcd";
2 s = s+1;
3 System.out.print(s);// result : abcd1
我們明明就是改變了String型的變數s的,為什麼說是沒有改變呢? 其實這是一種欺騙,JVM是這樣解析這段代碼的:首先創建對象s,賦予一個abcd,然後再創建一個新的對象s用來執行第二行代碼,也就是說我們之前對象s並沒有變化,所以我們說String類型是不可改變的對象了,由於這種機制,每當用String操作字元串時,實際上是在不斷的創建新的對象,而原來的對象就會變為垃圾被GC回收掉,可想而知這樣執行效率會有多底。
而StringBuffer與StringBuilder就不一樣了,他們是字元串變數,是可改變的對象,每當我們用它們對字元串做操作時,實際上是在一個對象上操作的,這樣就不會像String一樣創建一些而外的對象進行操作了,當然速度就快了。
3.一個特殊的例子:
1 String str = 「This is only a」 + 「 simple」 + 「 test」;
3 StringBuffer builder = new StringBuilder(「This is only a」).append(「 simple」).append(「 test」);
你會很驚訝的發現,生成str對象的速度簡直太快了,而這個時候StringBuffer居然速度上根本一點都不佔優勢。其實這是JVM的一個把戲,實際上:
String str = 「This is only a」 + 「 simple」 + 「test」;
其實就是:
String str = 「This is only a simple test」;
所以不需要太多的時間了。但大家這里要注意的是,如果你的字元串是來自另外的String對象的話,速度就沒那麼快了,譬如:
String str2 = 「This is only a」;
String str3 = 「 simple」;
String str4 = 「 test」;
String str1 = str2 +str3 + str4;
這時候JVM會規規矩矩的按照原來的方式去做。
4.StringBuilder與 StringBuffer
StringBuilder:線程非安全的
StringBuffer:線程安全的
當我們在字元串緩沖去被多個線程使用是,JVM不能保證StringBuilder的操作是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。
對於三者使用的總結: 1.如果要操作少量的數據用 = String
2.單線程操作字元串緩沖區 下操作大量數據 = StringBuilder
3.多線程操作字元串緩沖區 下操作大量數據 = StringBuffer
B. c++字元串緩沖區問題
C. String,StringBuffer和StringBuilder的區別
String 字元串常量
StringBuffer 字元串變數(線程安全)
StringBuilder 字元串變數(非線程安全)
簡要的說, String 類型和 StringBuffer 類型的主要性能區別其實在於 String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後將指針指向新的 String 對象,所以經常改變內容的字元串最好不要用 String ,因為每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以後, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。
而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字元串對象經常改變的情況下。而在某些特別情況下, String 對象的字元串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度並不會比 StringBuffer 對象慢,而特別是以下的字元串對象生成中, String 效率是遠要比 StringBuffer 快的:
String S1 = 「This is only a」 + 「 simple」 + 「 test」;
StringBuffer Sb = new StringBuilder(「This is only a」).append(「 simple」).append(「 test」);
你會很驚訝的發現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不佔優勢。其實這是 JVM 的一個把戲,在 JVM 眼裡,這個
String S1 = 「This is only a」 + 「 simple」 + 「test」; 其實就是:
String S1 = 「This is only a simple test」; 所以當然不需要太多的時間了。但大家這里要注意的是,如果你的字元串是來自另外的 String 對象的話,速度就沒那麼快了,譬如:
String S2 = 「This is only a」;
String S3 = 「 simple」;
String S4 = 「 test」;
String S1 = S2 +S3 + S4;
這時候 JVM 會規規矩矩的按照原來的方式去做
在大部分情況下 StringBuffer > String
StringBuffer
Java.lang.StringBuffer線程安全的可變字元序列。一個類似於 String 的字元串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字元序列,但通過某些方法調用可以改變該序列的長度和內容。
可將字元串緩沖區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串列順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字元串,然後將該字元串的字元追加或插入到字元串緩沖區中。append 方法始終將這些字元添加到緩沖區的末端;而 insert 方法則在指定的點添加字元。
例如,如果 z 引用一個當前內容是「start」的字元串緩沖區對象,則此方法調用 z.append("le") 會使字元串緩沖區包含「startle」,而 z.insert(4, "le") 將更改字元串緩沖區,使之包含「starlet」。
在大部分情況下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一個可變的字元序列是5.0新增的。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字元串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。
D. 字元串和字元串緩沖區的區別
以一個例子來說明:
char s[100]="Good morning!";
在這里字元串緩沖區是100個位元組。而字元串的長度是13,字元串的存儲空間是14個位元組。
E. java中的字元串緩沖區是什麼意思
如果你說的緩沖區是在IO操作中的話,指的就是先將數據寫在內存中,等寫入一定數量後再往硬碟上寫。
如果你說的不是IO操作中的緩沖區的話,那可能是指StringBuilder這個類的作用了。
StringBuilder是一個類似於
String
的字元串緩沖區。可將字元串緩沖區安全地用於多個線程。所以比直接對String操作更有效率也更穩定。
F. ORA-06502: PL/sql: 數字或值錯誤 : 字元串緩沖區太小,如何處理!
你賦給變數的值的長度,超出了變數的長度。比如:
過程中定義了一個變數 a varchar2(2); -- a的長度為2
而在賦值時 a := '123123'; -- '123123'的長度為6
這樣就會出現你所遇到的問題,解決方法是找到變數,將其長度加大,注意:plsql中varchar2長度上限是4000
G. 舉例說明字元串和字元串緩沖區的區別
如果說的是java的話,這是兩個不同的對象:String和StringBuffer。
它們最核心的區別是:
String的長度是不可變的,StringBuffer的長度是可變的。
StringBuffer的特點:
1、是一個字元串緩沖區,其實就是一個容器。
2、長度是可變,任意類型都行。注意:是將任意數據都轉成字元串進行存儲。
3、容器對象提供很多對容器中數據的操作功能,比如:添加,刪除,查找,修改。
4、所有的數據最終變成一個字元串。
最後,StringBuffer還有一個特性是線程安全的容器。
H. 8086匯編語言中如何清空緩沖區里的字元串
最簡單的就是往那個緩沖區送一堆零過去,通常將CX設置成緩沖區的長度,將AL清零,然後使用重復字元串操作指令來清空緩沖區:
MOV
CX,
LEN
;緩沖區的長度,以位元組為單位
LEA
DI,
STR_BUFF
;緩沖區首地址送如
DI
寄存器
XOR
AL,
AL
;AL
清零
REPZ
STOSB
;重復至CX等於0
如果緩沖區巨大,可以送字過去,這樣可以加快運行速度:
MOV
BX,
LEN
;緩沖區長度
MOV
CL,
2
SHR
BX,
CL
;緩沖區長度除以2,得到緩沖區的字長度
MOV
CX,
BX
;送入CX計數器
LEA
DI,
STR_BUFF
;字元串緩沖區首地址送如DI寄存器
XOR
AX,
AX
;AX寄存器清零
REPZ
STOSW
;重復至CX等於0
有時候還要考慮緩沖區是奇數,即緩沖區執行上訴代碼後,還有一個位元組沒有處理,這時候,需要多加幾句。
XOR
DX,
DX
MOV
BX,
LEN
TEST
BX,
1
JZ
L1
MOV
DX,
0FFH
;做標記,指明字元串是奇數
L1:
MOV
CL,
2
SHR
BX,
CL
;緩沖區長度除以2,得到緩沖區的字長度
MOV
CX,
BX
;送入CX計數器
LEA
DI,
STR_BUFF
;字元串緩沖區首地址送如DI寄存器
XOR
AX,
AX
;AX寄存器清零
REPZ
STOSW
;重復至CX等於0
CMP
DX,
0FFH
JNZ
EXIT
STOSB
EXIT:
......
還有許多其他的方法,但是效率最高的就是這個了,其他利用LOOP等循環指令或CMP
CX,
0,JNZ
xx
這種方法速度都要慢一下。
I. 如何理解字元串緩沖區
字元串緩沖區就是stringBuffer類,作為常用的string類來說,是不可改變的,每次的創建都會為string在內存中分配一次空間,這樣在大量的字元串的操作時,是很不可取的,這時可以使用stringBuffer類,這個類使字元串能自動的根據獲取的大小分配內存,減小了系統的內存壓力.