一辱揭、Java String 類——String字符串常量
字符串廣泛應(yīng)用 在Java 編程中汪诉,在 Java 中字符串屬于對(duì)****象讼稚,Java 提供了String 類來(lái)****創(chuàng)建****和****操作****字符串舅踪。
需要注意的是,String的值是不可變的选侨,這就導(dǎo)致每次對(duì)String的操作都會(huì)生成新的String對(duì)象掖鱼,這樣不僅效率低下,而且大量浪費(fèi)有限的內(nèi)存空間援制。我們來(lái)看一下這張對(duì)String操作時(shí)內(nèi)存變化的圖:
?
我們可以看到戏挡,初始String值為“hello”,然后在這個(gè)字符串后面加上新的字符串“world”晨仑,這個(gè)過(guò)程是需要重新在棧堆內(nèi)存中開(kāi)辟內(nèi)存空間的褐墅,最終得到了“hello world”字符串也相應(yīng)的需要開(kāi)辟內(nèi)存空間拆檬,這樣短短的兩個(gè)字符串,卻需要開(kāi)辟三次內(nèi)存空間妥凳,不得不說(shuō)這是對(duì)內(nèi)存空間的極大浪費(fèi)竟贯。為了應(yīng)對(duì)經(jīng)常性的字符串相關(guān)的操作,谷歌引入了兩個(gè)新的類——StringBuffer類和StringBuild類來(lái)對(duì)此種變化字符串進(jìn)行處理逝钥。
二澄耍、StringBuffer 和 StringBuilder 類——StringBuffer、StringBuilder字符串變量
**?**
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候晌缘,需要使用 StringBuffer 和 StringBuilder 類。
和 String 類不同的是痢站,StringBuffer 和 StringBuilder 類的對(duì)象能夠被多次的修改磷箕,并且不產(chǎn)生新的未使用對(duì)象。
StringBuilder 類在 Java 5 中被提出阵难,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問(wèn))岳枷。
由于 StringBuilder 相較于 StringBuffer 有速度優(yōu)勢(shì),所以多數(shù)情況下建議使用 StringBuilder 類呜叫。然而在應(yīng)用程序要求線程安全的情況下空繁,則必須使用 StringBuffer 類。
三者的繼承結(jié)構(gòu)
**?**
三者的區(qū)別:
(1)字符修改上的區(qū)別(主要)
String:不可變字符串朱庆;
StringBuffer:可變字符串盛泡、效率低、線程安全娱颊;
StringBuilder:可變字符序列傲诵、效率高、線程不安全箱硕;
(2)初始化上的區(qū)別拴竹,****String可以空賦值,后者不行剧罩,報(bào)錯(cuò)
①String
StringBuffer s = null;
StringBuffer s = “abc”;
②StringBuffer
StringBuffer s = null; //結(jié)果警告:Null pointer access: The variable result can only be null at this location
StringBuffer s = new StringBuffer();//StringBuffer對(duì)象是一個(gè)空的對(duì)象
StringBuffer s = new StringBuffer(“abc”);//創(chuàng)建帶有內(nèi)容的StringBuffer對(duì)象,對(duì)象的內(nèi)容就是字符串”
小結(jié):(1)如果要操作少量的數(shù)據(jù)用 String栓拜;
(2)多線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù) StringBuffer;
(3)單線程操作字符串緩沖區(qū)下操作大量數(shù)據(jù) StringBuilder(推薦使用)惠昔。
三幕与、StringBuilder類在Android中運(yùn)用示例
(1)上官方文檔,StringBuilder舰罚,A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.
The principal operations on a StringBuilder are theappend and insert methods, which are overloaded so as to accept data of any type. Each effectively converts a given datum to a string and then appends or inserts the characters of that string to the string builder. The append method always adds these characters atthe end of the builder; the insert method adds the characters at a specified point.
參考網(wǎng)址:<u>https://developer.android.google.cn/reference/java/lang/StringBuilder.html</u>
由上面的官方文檔纽门,我們知道以下幾點(diǎn):
一個(gè)可變的字符序列。StringBuilder類提供一個(gè)與StringBuffer兼容的API营罢,但不保證同步赏陵。該類被設(shè)計(jì)用作StringBuffer的一個(gè)簡(jiǎn)單替換饼齿,用在字符串緩沖區(qū)被單個(gè)線程使用的時(shí)候(這種情況很普遍)。如果可能蝙搔,建議優(yōu)先采用該類缕溉,因?yàn)樵诖蠖鄶?shù)實(shí)現(xiàn)種,它比StringBuffer要快吃型。
在StringBuilder上的主要操作時(shí)append和insert方法证鸥,可重載這些方法,以接收任意類型的數(shù)據(jù)勤晚。每個(gè)方法都能有效地將給定的數(shù)據(jù)轉(zhuǎn)換成字符串枉层,然后將該字符串的字符追加或插入到字符串生成器中,append方法始終將這些字符添加到生成器的末端赐写,而insert方法則在指定的點(diǎn)添加字符鸟蜡。
例如,如果z引用一個(gè)當(dāng)前內(nèi)容為“start”的字符串的生成器對(duì)象挺邀,則該方法調(diào)用z.append("le")將使字符串生成器包含“startle”揉忘,而z.insert(4,"le")將更改字符串生成器,使之包含“startlet”端铛。
通常泣矛,如果sb引用StringBuilder的實(shí)例,則sb.append(x)和sb.insert(sb.length(),x)具有相同的效果。每個(gè)字符串生成器都有一定的容量禾蚕,只要字符串生成器包含的字符序列的長(zhǎng)度沒(méi)有超出此容量您朽,就無(wú)需分配新的內(nèi)容緩沖區(qū)。如果內(nèi)容緩沖區(qū)溢出夕膀,則此容量自動(dòng)增大虚倒。
將StringBuilder的實(shí)例用于多個(gè)線程是不安全的。如果需要這樣的同步产舞,則建議使用StringBuffer魂奥。
(2)上代碼,具體實(shí)現(xiàn)
new Thread(new Runnable){
@Override
public void run(){
HttpURLConnection connection = null;
BufferedReader reader = null;
try{
URL url = new URL("http://www.baidu.com");
connection = (HttpURLConnection)url.openConnection();
connnection.setRequestMethod("GET");
InputStream in = connection.getInputStream();
//下面對(duì)獲取到的輸入流進(jìn)行讀取
reader= new BufferedReader(new InputStreamReader(in));
StringBuilder response = new(StringBuilder());
String line;
While ((line =reader.readLine())!= null ){
response.appen d(line));
}
showResponse(reponse.toString())
}
}......
}
上段代碼模擬的是向百度網(wǎng)請(qǐng)求數(shù)據(jù)易猫,然后對(duì)網(wǎng)站返回的數(shù)據(jù)流進(jìn)行讀取耻煤,最終應(yīng)用StringBuilder()進(jìn)行字符串?dāng)?shù)據(jù)的讀取和顯示。
總結(jié):末尾總是有福利准颓,三者區(qū)別可參照下表:
說(shuō)明:博主博客會(huì)同步發(fā)布到CSDN哈蝇,歡迎閱讀