Java基礎(chǔ)-String、StringBuffer與StringBuilder

String

String 類代表字符串耀怜。字符串是常量;它們的值在創(chuàng)建之后不能更改桐愉。

String的方法

.equals

很多人經(jīng)常把.equals和==混淆财破。==用來比較是否是同一對象, .equals 用來比較內(nèi)容是否相同从诲。 接下來我們用代碼來驗(yàn)證一下兩者的區(qū)別左痢。
運(yùn)行如下代碼:

        String abc = "abc" + "bcd";// 常量
        
        String bcd = "bcd";

        String abc1 = "abc" + bcd;// 不是常量
        if (abc == abc1) {
            System.out.println("同一個對象");
        } else {
            System.out.println("不同對象");
        }
        if (abc.equals(abc1)) {
            System.out.println("內(nèi)容相同");
        } else {
            System.out.println("內(nèi)容不同");
        }

結(jié)果:

不同對象
內(nèi)容相同

經(jīng)過上面的驗(yàn)證,相信你對 equals 方法有了一定的理解系洛。我們再來看看 equals 的底層實(shí)現(xiàn):

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

這里第一個if判斷驗(yàn)證是否是同一個對象俊性,如果是內(nèi)容必定相等,返回true描扯;第二個則是用來判斷內(nèi)容是否相同定页。

其他常用方法

String還有一些其他的常用方法,下面給大家羅列一下:
1.構(gòu)造方法
String的構(gòu)造方法可以放入 byte 數(shù)組绽诚,char 數(shù)組典徊,StringBuffer杭煎, StringBuilder 等參數(shù),構(gòu)造器會自動將其轉(zhuǎn)換成String類型宫峦,非常方便岔帽。如:String(char[] value) 可以分配一個新的 String ,使其表示字符數(shù)組參數(shù)中當(dāng)前包含的字符序列导绷。
2.方法摘要
(1)charAt(int index):返回指定索引處的char值犀勒。
(2)compareTo(String anotherString):按字典順序比較兩個字符串。 可用于字符串排序妥曲。
(3)isEmpty():當(dāng)且僅當(dāng) length() 為 0 時返回 true贾费。經(jīng)常用到的判定條件。
(4)length():返回此字符串的長度檐盟。
(5)matches(String regex): 告知此字符串是否匹配給定的正則表達(dá)式褂萧。
(6)replace(char oldChar, char newChar):返回一個新的字符串,它是通過用 newChar 替換此字符串中出現(xiàn)的所有 oldChar 得到的葵萎。
(7)split(String regex):根據(jù)給定正則表達(dá)式的匹配拆分此字符串导犹。
(8)startsWith(String prefix):測試此字符串是否以指定的前綴開始。經(jīng)常用的判定條件羡忘。
(9)substring(int beginIndex):返回一個新的字符串谎痢,它是此字符串的一個子字符串。截取字符串時使用卷雕,參數(shù)是開始截取的位置节猿。
(10)substring(int beginIndex, int endIndex): 截取字符串時使用,參數(shù)是開始截取的位置和結(jié)束位置漫雕,左閉右開滨嘱。
(11)toCharArray(): 將此字符串轉(zhuǎn)換為一個新的字符數(shù)組。
(12)toString(): 返回此對象本身(它已經(jīng)是一個字符串=洹)太雨。
(13)valueOf(各種類型參數(shù)): 返回各種類型參數(shù)的字符串表示形式。

StringBuffer

StringBuffer 是線程安全的可變字符序列发框。一個類似于 String 的字符串緩沖區(qū)躺彬,正常來說它的初始容量為 16 個字符,如果后來需要更多容量梅惯,它會另外開辟更大的空間,將原來的字符轉(zhuǎn)存到新的空間中仿野。 StringBuffer用在多種數(shù)據(jù)類型的拼接和若干次拼接铣减,效率更高,內(nèi)存更節(jié)省

構(gòu)造方法

StringBuffer 最常使用的構(gòu)造方法有兩種一種是StringBuffer()脚作,只是創(chuàng)建 16 個字符的緩沖區(qū)葫哗;另一種是StringBuffer(String str)缔刹,它不僅構(gòu)造了一個字符串緩沖區(qū),還會將參數(shù) str 初始化為指定的字符串內(nèi)容劣针。

常用方法

StringBuffer 常用的方法有:追加校镐、插入、刪除捺典、修改等鸟廓。

追加

使用 append 方法在最后添加。

插入

使用 insert 方法在指定位置添加襟己。

刪除

使用 delete 方法刪除指定區(qū)域引谜,左閉右開。end多大都不會越界擎浴,只有start為負(fù)數(shù)员咽,大于長度或大于end時報錯。

修改

使用 replace 方法將指定區(qū)域的字符替換成新字符串贮预,左閉右開贝室。

代碼

public class Main {
    public static void main(String[] args) {
        // StringBuffer是一個將字符數(shù)組封裝起來的類
        StringBuffer sb = new StringBuffer("abc");
        // 追加
        sb.append("a");
        System.out.println(sb);
        // 插入
        sb.insert(2,"Java");
        System.out.println(sb);
        // 刪除
        sb.delete(2,6);
//        sb.delete(2,100); 沒有越界,只有start為負(fù)數(shù)仿吞,大于長度或大于end時報錯
        System.out.println(sb);
        // 修改
        sb.replace(2,3,"Java");
        System.out.println(sb);
        // StringBuffer 轉(zhuǎn)成String
        // 方式一:
        String string = sb.toString();
        // 方式二:
        String string1 = new String(sb);
    }
}

StringBuilder

一個可變的字符序列滑频。此類提供一個與 StringBuffer 兼容的 API,但不保證同步茫藏。在單線程比StringBuffer更快误趴。
由于 API 與 StringBuffer 兼容,方法是一樣的务傲,不再贅述凉当。

區(qū)別

String 是不可以改變的,更改 String 對象的實(shí)質(zhì)是生成新的 String 對象存放修改后的字符串售葡。所以對于需要經(jīng)常修改的字符串看杭,建議使用 StringBuffer 和 StringBuilder 。
而 StringBuilder 作為JDK 5為 StringBuffer 補(bǔ)充的一個單個線程使用的等價類挟伙,有一個與 StringBuffer 兼容的 API 楼雹,且在單線程中效率更高。
但 StringBuffer 在多線程的情況下比 StringBuilder 更安全尖阔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贮缅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子介却,更是在濱河造成了極大的恐慌谴供,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齿坷,死亡現(xiàn)場離奇詭異桂肌,居然都是意外死亡数焊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門崎场,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佩耳,“玉大人,你說我怎么就攤上這事谭跨「珊瘢” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵饺蚊,是天一觀的道長萍诱。 經(jīng)常有香客問我,道長污呼,這世上最難降的妖魔是什么裕坊? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮燕酷,結(jié)果婚禮上籍凝,老公的妹妹穿的比我還像新娘。我一直安慰自己苗缩,他們只是感情好饵蒂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酱讶,像睡著了一般退盯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泻肯,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天渊迁,我揣著相機(jī)與錄音,去河邊找鬼灶挟。 笑死琉朽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稚铣。 我是一名探鬼主播箱叁,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惕医!你這毒婦竟也來了耕漱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抬伺,失蹤者是張志新(化名)和其女友劉穎孤个,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沛简,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齐鲤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椒楣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片给郊。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捧灰,靈堂內(nèi)的尸體忽然破棺而出淆九,到底是詐尸還是另有隱情,我是刑警寧澤毛俏,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布炭庙,位于F島的核電站,受9級特大地震影響煌寇,放射性物質(zhì)發(fā)生泄漏焕蹄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一阀溶、第九天 我趴在偏房一處隱蔽的房頂上張望腻脏。 院中可真熱鬧,春花似錦银锻、人聲如沸永品。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼎姐。三九已至,卻和暖如春更振,著一層夾襖步出監(jiān)牢的瞬間炕桨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工殃饿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谋作,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓乎芳,卻偏偏與公主長得像遵蚜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奈惑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容