認(rèn)識(shí)Java中的字符串

學(xué)習(xí)了解

  1. 什么是Java的字符串
  • Java字符串的不變性
  • Java中Stirng類的常用方法1
  • Java中String類的常用方法2
  • 認(rèn)識(shí)Java中的StringBuilder類
  • Java 中的 StringBuilder 類的常用方法

具體內(nèi)容

1、什么是Java的字符串

在程序開發(fā)中字符串無(wú)處不在昧狮,如用戶登陸時(shí)輸入的用戶名景馁、密碼等使用的就是字符串。其實(shí)逗鸣,在前面的章節(jié)中我們就已經(jīng)使用了字符串合住,例如我們?cè)诳刂婆_(tái)中輸出的 "Hello World" 、 "imooc" 等撒璧。

在 Java 中透葛,* 字符串被作為 String 類型的對(duì)象 * 處理。 String 類位于 java.lang 包中卿樱。默認(rèn)情況下僚害,該包被自動(dòng)導(dǎo)入所有的程序。

創(chuàng)建String對(duì)象的3種方法

  1. 創(chuàng)建一個(gè)字符串對(duì)象imooc繁调,名為s1
    String s1 = "imooc";
  2. 創(chuàng)建一個(gè)空字符串對(duì)象萨蚕,名為s2
    String s2 = new String();
  3. 創(chuàng)建一個(gè)字符串對(duì)象imooc,名為s3
    String s3 = new String("imooc");

2蹄胰、Java中字符串的不變性

String 對(duì)象創(chuàng)建后則不能被修改岳遥,是不可變的,所謂的修改其實(shí)是創(chuàng)建了新的對(duì)象裕寨,所指向的內(nèi)存空間不同浩蓉。

示例

/**
 * Created by 99479 on 2017/7/1.
 */
public class NeverChangeTest {

    public static void main(String[] args) {
        String s1 = "psj";
        String s2 = "psj";
        String s3 = new String("psj");
        String s4 = new String("psj");

        //多次出現(xiàn)的字符串常量派继,Java編譯程序只創(chuàng)建一個(gè),所以返回true
        System.out.println(s1==s1);
        //s1和s3是不同的對(duì)象捻艳,所以返回false
        System.out.println(s1 == s3);
        //s3和s4是不同的對(duì)象驾窟,所以返回false
        System.out.println(s3 == s4);

        s1 = "歡迎您來(lái):"+ s1;
        System.out.println(s1);
        System.out.println(s1==s2);
    }
}

輸出

true
false
false
歡迎您來(lái):psj
false

** 代碼解釋 **
1、 通過(guò) String s1="psj"; 聲明了一個(gè)字符串對(duì)象讯泣, s1 存放了到字符串對(duì)象的引用纫普,在內(nèi)存中的存放引用關(guān)系如下圖所示:

image.png

然后通過(guò) s1="歡迎您來(lái):"+s1; 改變了字符串 s1 阅悍,其實(shí)質(zhì)是創(chuàng)建了新的字符串對(duì)象好渠,變量 s1 指向了新創(chuàng)建的字符串對(duì)象,如下圖所示:

image.png

2节视、 一旦一個(gè)字符串在內(nèi)存中創(chuàng)建拳锚,則這個(gè)字符串將不可改變。如果需要一個(gè)可以改變的字符串寻行,我們可以使用StringBuffer或者StringBuilder
3霍掺、 每次 new 一個(gè)字符串就是產(chǎn)生一個(gè)新的對(duì)象,即便兩個(gè)字符串的內(nèi)容相同拌蜘,使用 ”==” 比較時(shí)也為 ”false” ,如果只需比較內(nèi)容是否相同杆烁,應(yīng)使用 ”equals()” 方法

Java中String類的常用方法 1

String類提供了許多用來(lái)處理字符串的方法,例如简卧,獲取字符出啊長(zhǎng)度兔魂,最字符串進(jìn)行截取,將字符串轉(zhuǎn)換為大寫或小寫举娩,字符分割等析校。
** String類常用方法 **

image.png

** 示例 **

import java.lang.reflect.Array;
import java.util.Arrays;

/**
 * Created by 99479 on 2017/7/4.
 */
public class NomalMethedTest {
    public static void main(String[] args) {
        //定義一個(gè)字符串“學(xué)習(xí)JAVA編程”
        String str = "學(xué)習(xí)了JAVA 編程";
        //打印除字符串長(zhǎng)度
        System.out.println("字符串長(zhǎng)度:"+str.length());
        //查找字符‘編的位置’
        char c = '編';
        System.out.println("字符‘編’的位置:"+str.indexOf(c));
        //查找字符串‘JAVA’的位置
        System.out.println("字符串'JAVA'的位置:"+str.indexOf("JAVA"));
        //查找字符串‘psj’的位置,找不但返回‘-1’
        System.out.println("字符串‘psj’的位置:"+str.indexOf("psj"));
        //按空格將字符串分為一個(gè)數(shù)組铜涉,并輸出數(shù)組元素
        String [] arr = str.split(" ");
        System.out.println("按空格拆分成數(shù)組:"+ Arrays.toString(arr));
        System.out.println();
        //獲取索引位置[3智玻,7)之間的字符串
        System.out.println("獲取位置[3,7)之間的字符串:"+str.substring(3,7));
    }
}

** 輸出 **

字符串長(zhǎng)度:10
字符‘編’的位置:8
字符串'JAVA'的位置:3
字符串‘psj’的位置:-1
按空格拆分成數(shù)組:[學(xué)習(xí)了JAVA, 編程]

獲取位置[3芙代,7)之間的字符串:JAVA

Java中的String類常用方法2

** 示例 **

public class NomalMethedTest02 {
    public static void main(String[] args) {
        //定義一個(gè)字符串“學(xué)習(xí)JAVA編程”
        String str = "學(xué)習(xí)了JAVA 編程";

        //將字符串轉(zhuǎn)為小寫
        System.out.println("轉(zhuǎn)換為小寫:"+str.toLowerCase());
        //獲取索引位置為1的字符
        System.out.println("獲取索引位置為1位置的字符:"+str.charAt(1));
        //將字符串轉(zhuǎn)換為byte[]吊奢,并打印輸出
        byte[] b = str.getBytes();
        System.out.println("轉(zhuǎn)換為字節(jié)數(shù)組: ");
        for (byte o:b) {
            System.out.println(""+o);
        }
        System.out.println();
        //和另外一個(gè)字符串“學(xué)習(xí)JAVA 編程”進(jìn)行比較
        String str2 = new String("學(xué)習(xí)JAVA 編程");
        System.out.println("str和str2的內(nèi)存地址相同?"+(str==str2));
        System.out.println("str和str2的內(nèi)容相同纹烹?"+str.equals(str2));
    }
}

輸出

轉(zhuǎn)換為小寫:學(xué)習(xí)了java 編程
獲取索引位置為1位置的字符:習(xí)
轉(zhuǎn)換為字節(jié)數(shù)組: 
-27
-83
-90
-28
-71
-96
-28
-70
-122
74
65
86
65
32
-25
-68
-106
-25
-88
-117

str和str2的內(nèi)存地址相同页滚?false
str和str2的內(nèi)容相同?false

** PS **
字節(jié)是計(jì)算機(jī)存儲(chǔ)信息的基本單位滔韵,1個(gè)字節(jié)等于8個(gè)位逻谦,gbk編碼中1個(gè)漢字字符存儲(chǔ)需要2個(gè)字節(jié),1個(gè)英文字符需要一個(gè)1節(jié)陪蜻。所以我們看到上面的程序運(yùn)行結(jié)果中邦马,每個(gè)漢字對(duì)應(yīng)兩個(gè)字節(jié)值,如“學(xué)”對(duì)應(yīng)“-47 -89”,而因?yàn)樽址癑”對(duì)應(yīng)“74”滋将。同時(shí)邻悬,我們還發(fā)現(xiàn)漢字對(duì)應(yīng)的字節(jié)值為負(fù)數(shù),原因在于每個(gè)每隔字節(jié)是8位随闽,最大值不能超過(guò)127父丰,而漢字轉(zhuǎn)換為字節(jié)后超過(guò)127,如果超過(guò)就會(huì)溢出掘宪,以負(fù)數(shù)的形式顯示蛾扇。

認(rèn)識(shí)Java 中的StringBuilder類

在Java中,除了可以使用String類來(lái)存儲(chǔ)字符串魏滚,還可以使用StringBuilder類或StringBuffer類存儲(chǔ)字符串镀首,它們之間的區(qū)別是:

  • String類具有是不可變性
    ** 范例 **
public class BuilderOrBufferTest {
    public static void main(String[] args) {
        String str = "hello";
        System.out.println(str + "world  !");
        System.out.println(str);
    }
}

輸出

helloworld  !
hello

從運(yùn)行結(jié)果中我們可以看到,程序運(yùn)行時(shí)會(huì)額外創(chuàng)建一個(gè)對(duì)象鼠次,保存 "helloworld"更哄。當(dāng)頻繁操作字符串時(shí),就會(huì)額外產(chǎn)生很多臨時(shí)變量腥寇。使用 StringBuilder 或 StringBuffer 就可以避免這個(gè)問題成翩。至于 StringBuilder 和StringBuffer ,它們基本相似赦役,不同之處麻敌,StringBuffer 是線程安全的,而 StringBuilder 則沒有實(shí)現(xiàn)線程安全功能扩劝,所以性能略高庸论。因此一般情況下,如果需要?jiǎng)?chuàng)建一個(gè)內(nèi)容可變的字符串對(duì)象棒呛,應(yīng)優(yōu)先考慮使用 StringBuilder 類聂示。
** 范例 **

/**
 * Created by 99479 on 2017/7/4.
 */
public class BuilderOrBufferTest {
    public static void main(String[] args) {
        
        //創(chuàng)建一個(gè)空的StringBuilder對(duì)象
        StringBuilder str1 = new StringBuilder();
        //創(chuàng)建一個(gè)字符串“psj”
        StringBuilder str2 = new StringBuilder("psj");
        System.out.println(str2);
    }
}

** 輸出 **

psj

Java中的StringBuilder類的常用方法

StringBuilder類提供了很多方法來(lái)操作字符串:

image.png

例如:在下面的示例代碼中,創(chuàng)建了StringBuilder對(duì)象簇秒,來(lái)存儲(chǔ)字符串鱼喉,并對(duì)其做了追加和插入操作。這些操作修改了str對(duì)象的值 趋观,而沒有創(chuàng)建新的對(duì)象扛禽,這就是StringBuilder和String最大的區(qū)別。
** 范例 **

public class BuilderNomalMethed {
    public static void main(String[] args) {
        //創(chuàng)建StringBuilder對(duì)象皱坛,存儲(chǔ)字符串
        StringBuilder str = new StringBuilder("hello");
        str.append( " psj");//在字符串后面追加字符串
        str.append(520);//在字符串后面追加整數(shù)
        System.out.println("字符串長(zhǎng)度:"+str.length());
        System.out.println("插入前:"+str);

        str.insert(12,"!");
        String str2 = str.toString();
        System.out.println("插入后:"+str2);
    }
}

輸出

字符串長(zhǎng)度:12
插入前:hello psj520
插入后:hello psj520!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末编曼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子剩辟,更是在濱河造成了極大的恐慌蚕断,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菌瘫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡萍膛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嚷堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蝗罗,“玉大人,你說(shuō)我怎么就攤上這事蝌戒〈埽” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵瓶颠,是天一觀的道長(zhǎng)拟赊。 經(jīng)常有香客問我刺桃,道長(zhǎng)粹淋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任瑟慈,我火速辦了婚禮桃移,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葛碧。我一直安慰自己借杰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布进泼。 她就那樣靜靜地躺著蔗衡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乳绕。 梳的紋絲不亂的頭發(fā)上绞惦,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音洋措,去河邊找鬼济蝉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛菠发,可吹牛的內(nèi)容都是我干的王滤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼滓鸠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼雁乡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起糜俗,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤踱稍,失蹤者是張志新(化名)和其女友劉穎墩弯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寞射,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡渔工,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桥温。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片引矩。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖侵浸,靈堂內(nèi)的尸體忽然破棺而出旺韭,到底是詐尸還是另有隱情,我是刑警寧澤掏觉,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布区端,位于F島的核電站,受9級(jí)特大地震影響澳腹,放射性物質(zhì)發(fā)生泄漏织盼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一酱塔、第九天 我趴在偏房一處隱蔽的房頂上張望沥邻。 院中可真熱鬧,春花似錦羊娃、人聲如沸唐全。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邮利。三九已至,卻和暖如春垃帅,著一層夾襖步出監(jiān)牢的瞬間延届,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工挺智, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祷愉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓赦颇,卻偏偏與公主長(zhǎng)得像二鳄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子媒怯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 1订讼、什么是 Java 中的字符串 在程序開發(fā)中字符串無(wú)處不在,如用戶登陸時(shí)輸入的用戶名扇苞、密碼等使用的就是字符串欺殿。其...
    夏沫xx閱讀 1,261評(píng)論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法寄纵,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法脖苏,繼承相關(guān)的語(yǔ)法程拭,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,664評(píng)論 18 399
  • 集合框架: 1)特點(diǎn):存儲(chǔ)對(duì)象棍潘;長(zhǎng)度可變恃鞋;存儲(chǔ)對(duì)象的類型可不同2)Collection(1)List:有序的;元素...
    Demo_Yang閱讀 1,269評(píng)論 0 4
  • (一)Java部分 1亦歉、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,114評(píng)論 0 62
  • 從未消失的還有那從未消失的回憶恤浪,關(guān)于青春的回憶,關(guān)于愛情的回憶肴楷∷桑可在這個(gè)窘迫的環(huán)境里,我赛蔫,還有她砂客,卻都只剩下關(guān)于親...
    肖的救贖閱讀 384評(píng)論 7 9