Java中String戒职、StringBuilder栗恩、StringBuffer

java中創(chuàng)建類和對(duì)象的方式

1.自定義類,然后通過自定義的類創(chuàng)建對(duì)象洪燥。
2.sun提供了很多的類給我使用磕秤,我們只需要認(rèn)識(shí)這些類乳乌,我們就可以通過這些類創(chuàng)建對(duì)象了。

Object類:

Object類是所有類的終極父類市咆。 任何一個(gè)類都繼承了Object類汉操。

Object類常用的方法:

  1. toString(); 返回該對(duì)象的字符串表示。 返回一個(gè)字符串用于描述該對(duì)象的蒙兰。 重寫toString之后磷瘤,我們直接輸出一個(gè)對(duì)象的時(shí)候,就會(huì)輸出符合我們所需求的格式數(shù)據(jù)癞己。
    2.equals(Object obj) 用于比較兩個(gè)對(duì)象的內(nèi)存地址,判斷兩個(gè)對(duì)象是否為同一個(gè)對(duì)象梭伐。

注意:"=="用于比較引用數(shù)據(jù)類型時(shí)痹雅,比較的是兩個(gè)對(duì)象的內(nèi)存地址,equals方法默認(rèn)情況下比較的也是兩個(gè)對(duì)象的內(nèi)存地址, 但是String類重寫了Object的equals方法糊识,方法內(nèi)部是將字符串轉(zhuǎn)換為字符數(shù)組绩社,比較每一個(gè)字符是否相同,一旦不相同就返回flase赂苗,相同就返回true愉耙。所以兩個(gè)字符串比較建議使用equals方法

3.hashCode() 返回該對(duì)象的哈希碼值(大家可以把哈希碼就 理解成是對(duì)象的內(nèi)存地址)

java中的規(guī)范:一般我們重寫了一個(gè)類的equals方法,我們都會(huì)重寫它的hashCode方法拌滋。

java是開源....源代碼公開...

查看源代碼的方式:

1. 按住crt(mac是Command)鍵朴沿,單擊查看源代碼
2.把光標(biāo)移動(dòng)到你需要查看的代碼按住fn + F3
    ```

Java中toString方法作用
>Object類具有一個(gè)toString()方法,你創(chuàng)建的每個(gè)類都會(huì)繼承該方法败砂。它返回對(duì)象的一個(gè)String表示赌渣,并且對(duì)于調(diào)試非常有幫助。然而對(duì)于默認(rèn)的toString()方法往往不能滿足需求昌犹,需要覆蓋這個(gè)方法坚芜。
toString()方法將對(duì)象轉(zhuǎn)換為字符串

public class Person {
String name;
String address;
int id;

public Person(String name, String address, int id) {
    this.name = name;
    this.address = address;
    this.id = id;
}

/// 重寫toString() 方法
@Override
public String toString() {
    return "name ==" + name + "address ==" + address + "id == " + id;
}

}

/// 打印person對(duì)象
public static void main(String[] args) {

    Person person = new Person("sey", "北京", 11111);
    System.out.println(person);
}

/// 重寫toString()方法后,打印結(jié)果: name ==seyaddress ==北京id == 11111
/// 未重寫toString()方法斜姥,打印結(jié)果為: Person@15db9742


Java中toString()方法和Objective-C中的description方法作用相同鸿竖,比如oc中重寫description方法,在打印對(duì)象時(shí)铸敏,可以將對(duì)象的屬性打印出來
  • (NSString *)description {

    return [NSString stringWithFormat:@"name==%@, address==%@", self.name, self.address];
    }


- ###String類:
>String類是一個(gè)常量缚忧,是不可改變的對(duì)象,這也就是說每次對(duì) String 類型進(jìn)行改變的時(shí)候其實(shí)都等同于生成了一個(gè)新的 String 對(duì)象杈笔,然后將引用連接到新的對(duì)象

兩種字符串創(chuàng)建方式:
1.```String str2 = "string";``` 
2.```String str3 = new String("string");```

 判斷一下字符串是否相同

public static void main(String[] args) {
String str1 = "string";
String str2 = "string";
String str3 = new String("string");
String str4 = new String("string");

    System.out.println("str1是否等于str3?" + (str1 == str2));
    System.out.println("str2是否等于str3?" + (str2 == str3));
    System.out.println("str3是否等于str4?" + (str3 == str4));
    System.out.println("str1是否等于str3?" + (str1.equals(str2)));
}

/// 打印結(jié)果
/*
str1是否等于str3?true
str2是否等于str3?false
str3是否等于str4?false
str1是否等于str3?true
*/


原因(需要先了解下Java中字符串的兩種創(chuàng)建方式):
第一種創(chuàng)建字符串的方式:```String str1 = "string";```這種方式創(chuàng)建字符串時(shí)搔谴,jvm首先檢查```方法區(qū)```的 ```字符串常量池```中是否存在該字符串的對(duì)象,如果存在桩撮,就不會(huì)在字符串常量池中創(chuàng)建了敦第,如果```字符串常量池```中不存在該字符串峰弹,那么就會(huì)在```字符串常量池```中創(chuàng)建該對(duì)象,并返回該對(duì)象的內(nèi)存地址芜果。
第二種創(chuàng)建字符串的方式:通過構(gòu)造方法```String str3 = new String("string");```這種方式創(chuàng)建字符串時(shí)鞠呈,jvm首先檢測(cè)```字符串常量池```中是否存在該字符串的對(duì)象,如果存在右钾,就不再在```字符串常量池```中創(chuàng)建該對(duì)象了蚁吝,如果不存在,那么就會(huì)在```字符串常量池```中創(chuàng)建該字符串的對(duì)象舀射,然后把```字符串常量池```中的該字符串拷貝到```堆內(nèi)存``窘茁,然后返回```堆內(nèi)存```中這個(gè)字符串對(duì)象的內(nèi)存地址

測(cè)試1: 
```String str = new String("string");```會(huì)創(chuàng)建多少個(gè)對(duì)象
答案: 2 個(gè),會(huì)在```字符串常量池```創(chuàng)建一個(gè)脆烟,再拷貝到堆內(nèi)存1個(gè)山林,共2個(gè)。

測(cè)試2:
```String str = ""; str = null ```
判斷```str.isEmpty()```放true還是flase
答案:報(bào)空指針錯(cuò)誤```java.lang.NullPointerException```

- 手動(dòng)實(shí)現(xiàn)String類trim()函數(shù)  -- 去掉字符串首尾的空格

// 自己實(shí)現(xiàn)trim()函數(shù)邢羔,去除字符串首尾的空格
public static String customTrim(String str) {

    // 先將字符串轉(zhuǎn)換為字符數(shù)據(jù)
    char[] arr = str.toCharArray(); 
    
    // 定義兩個(gè)索引驼抹,讓其一開始記錄字符數(shù)組的首位索引,然后遍歷字符數(shù)組記錄字符數(shù)組中的非空格開始的索引和非空格結(jié)尾的索引
    int startIndex = 0;
    int endIndex = arr.length - 1;
    for (int i = 0; i < arr.length; i++) {
        
        if (arr[startIndex] == ' ') {
            startIndex++;
        } else {
            break;
        }
        
        if (arr[endIndex] == ' ') {
            endIndex--;
        } else {
            break;
        }
    }
    
    // 根據(jù)開始和結(jié)束索引截取字符串
     return str.substring(startIndex, endIndex + 1);
}

/// 調(diào)用
public static void main(String[] args) {

    String string = "   今天天氣 真好啊      ";
    string = customTrim(string);
    System.out.println(string);
}

// 打印結(jié)果已去除首尾的空格: 今天天氣 真好啊


截取一個(gè)路徑的文件名
// 截取一個(gè)路徑的文件名
public static String getFileName(String path) {
    
    // 取出路徑中最后一個(gè)\的索引值拜鹤,注意: 單\是的意思框冀,通過單\判斷,需要些雙\\
    int index = path.lastIndexOf("/");
    
    // 截取字符串
    return path.substring(index + 1);
    
}

public static void main(String[] args) {

    String path = "/Users/mofeini/Desktop/subcate.plist";
    String fileName = getFileName(path);
    System.out.println(fileName);
}

反轉(zhuǎn)字符串中的字符

// 反轉(zhuǎn)字符串
public static String InvertString(String string) {

    // 將字符串轉(zhuǎn)換為字符數(shù)組敏簿,遍歷這個(gè)數(shù)組
    char[] arr = string.toCharArray();
    
    for (int startIndex = 0, endIndex = arr.length - 1; startIndex<endIndex; startIndex++, endIndex--){
        
        char temp = arr[startIndex];
        arr[startIndex] = arr[endIndex];
        arr[endIndex] = temp;
    }
    
     //將字符數(shù)組轉(zhuǎn)換為字符串
    String string2 = new String(arr);
        
    return string2;
}

統(tǒng)計(jì)子字符串在一個(gè)字符串中出現(xiàn)的次數(shù)

// 統(tǒng)計(jì)子字符串在一個(gè)字符串中出現(xiàn)的次數(shù)
public static int getCount(String string, String subStr) {

    int count= 0;  // 記錄查找到子串的次數(shù)
    int fromIndex = 0;  // 記錄從什么位置開始查找明也,只要查找到一個(gè),就讓fromIndex+=子串的長(zhǎng)度
    
    // 只有  能找到子串就接著找惯裕,找不到就會(huì)返回-1 結(jié)束語(yǔ)句
    while ((fromIndex = string.indexOf(subStr, fromIndex)) != -1) {
        count++;
        fromIndex += subStr.length();
    }
    
    return count;
}

String的特點(diǎn):字符串是常量诡右,一旦創(chuàng)建就不能修改了。
如果要頻繁修改字符串的內(nèi)容轻猖,建議使用字符串緩沖類(StringBuffer)

- ###StringBuffer其實(shí)就是一個(gè)存儲(chǔ)字符的容器帆吻。
StringBuffer 底層依賴一個(gè)字符數(shù)組才能存儲(chǔ)字符數(shù)據(jù)的,該字符數(shù)組默認(rèn)的初始容量為16咙边,如果字符數(shù)組的容量不夠使用猜煮,自動(dòng)增長(zhǎng)1倍+2

StringBuffer添加字符串a(chǎn)ppend()

StringBuffer sBuffer = new StringBuffer();
sBuffer.append("11");



StringBuffer容器的具備 的行為:
    
    String 
    
    增加
        append(boolean b)    可以添加任意類型 的數(shù)據(jù)到容器中
        insert(int offset, boolean b)  指定插入的索引值,插入對(duì)應(yīng) 的內(nèi)容败许。 

    刪除
        delete(int start, int end)  根據(jù)指定的開始與結(jié)束的索引值刪除對(duì)應(yīng)的內(nèi)容王带。
        deleteCharAt(int index)   根據(jù)指定 的索引值刪除一個(gè)字符。
    
    
    修改
    
        replace(int start, int end, String str) 根據(jù)指定 的開始與結(jié)束索引值替代成指定的內(nèi)容市殷。
        reverse()   翻轉(zhuǎn)字符串緩沖類的內(nèi)容愕撰。  abc--->cba
        
        setCharAt(int index, char ch)  把指定索引值的字符替換指定的字符。 
        substring(int start, int end)  根據(jù)指定的索引值截取子串。
        ensureCapacity(int minimumCapacity)  指定StringBuffer內(nèi)部的字符數(shù)組長(zhǎng)度的搞挣。
        
    查看
        indexOf(String str, int fromIndex) 查找指定的字符串第一次出現(xiàn)的索引值,并且指定開始查找的位置带迟。
        lastIndexOf(String str) 
        
        capacity() 查看當(dāng)前字符數(shù)組的長(zhǎng)度。 
        length() 
        
        charAt(int index) 
        toString()   把字符串緩沖類的內(nèi)容轉(zhuǎn)成字符串返回囱桨。
        

StringBuffer 與 StringBuilder的相同處與不同處:
    
    相同點(diǎn):
        1. 兩個(gè)類都是字符串緩沖類仓犬。
        2. 兩個(gè)類的方法都是一致的。
    不同點(diǎn):
        1. StringBuffer是線程安全的,操作效率低 舍肠,StringBuilder是線程非安全的,操作效率高搀继。
        2. StringBuffer是jdk1.0出現(xiàn) 的,StringBuilder 是jdk1.5的時(shí)候出現(xiàn)的翠语。
        
StringBuilder與StringBuffer 叽躯,通常應(yīng)該優(yōu)先用 StringBuilder類,因?yàn)樗С炙邢嗤牟僮骷±ǎ捎谒粓?zhí)行同步点骑,所以速度更快。
在大部分情況下的優(yōu)先級(jí)使用们童,StringBuilder>StringBuffer>String

當(dāng)final用來修飾String和StringBuffer時(shí)的區(qū)別
>要知道畔况,當(dāng)final用來修飾的時(shí)候鲸鹦,變量是不可變的慧库,往細(xì)了說,是變量所連接的內(nèi)存地址是不可變的馋嗜。
因此齐板,當(dāng)String類被修飾時(shí),此時(shí)的string就是一個(gè)常量葛菇,他的地址不可變甘磨,因此值不能改變;
但當(dāng)用來修飾StringBuffer類時(shí)眯停,卻可以調(diào)用它的append方法济舆,究其機(jī)理是StringBuffer類被創(chuàng)造可以改變他的內(nèi)存地址,因此他的地址在每次調(diào)用append時(shí)都可以改變,這個(gè)變量也隨之可變莺债。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滋觉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子齐邦,更是在濱河造成了極大的恐慌椎侠,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件措拇,死亡現(xiàn)場(chǎng)離奇詭異我纪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門浅悉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趟据,“玉大人,你說我怎么就攤上這事仇冯≈蓿” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵苛坚,是天一觀的道長(zhǎng)比被。 經(jīng)常有香客問我,道長(zhǎng)泼舱,這世上最難降的妖魔是什么等缀? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮娇昙,結(jié)果婚禮上尺迂,老公的妹妹穿的比我還像新娘。我一直安慰自己冒掌,他們只是感情好噪裕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著股毫,像睡著了一般膳音。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铃诬,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天祭陷,我揣著相機(jī)與錄音,去河邊找鬼趣席。 笑死兵志,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宣肚。 我是一名探鬼主播想罕,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼霉涨!你這毒婦竟也來了按价?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤嵌纲,失蹤者是張志新(化名)和其女友劉穎俘枫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逮走,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸠蚪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茅信。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盾舌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蘸鲸,到底是詐尸還是另有隱情妖谴,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布酌摇,位于F島的核電站膝舅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏窑多。R本人自食惡果不足惜仍稀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埂息。 院中可真熱鬧技潘,春花似錦、人聲如沸千康。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拾弃。三九已至值桩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砸彬,已是汗流浹背颠毙。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工斯入, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砂碉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓刻两,卻偏偏與公主長(zhǎng)得像增蹭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磅摹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 一、基礎(chǔ)接口/類 1. CharSequence CharSequence是一個(gè)接口帝美,表示char值的一個(gè)可讀序列...
    Lynn_R01612x2閱讀 565評(píng)論 0 0
  • 從網(wǎng)上復(fù)制的碍彭,看別人的比較全面,自己搬過來,方便以后查找庇忌。原鏈接:https://www.cnblogs.com/...
    lxtyp閱讀 1,345評(píng)論 0 9
  • 前言 RTFSC (Read the fucking source code )才是生活中最重要的舞箍。我們天天就是要...
    二毛_coder閱讀 455評(píng)論 1 1
  • String類 先看一下源碼(jdk1.8.0_144)中的對(duì)于類的定義 首先可以看到String類是被final...
    efan閱讀 591評(píng)論 1 1
  • 那年春寒料峭過后疏橄,已是春風(fēng)十里,綠意惹人憐略就,面對(duì)花海如潮捎迫,碧波蕩漾開來的美景,那讓人沉醉的春風(fēng)時(shí)刻卻讓那時(shí)我的內(nèi)心...
    馨雪清菡閱讀 701評(píng)論 5 3