JAVA String類

JAVA Doc

public final class String extends Object implements Serializable, Comparable, CharSequence

String 類代表字符串Java程序中的所有字符串字面值(如 "abc" )都作為此類的實(shí)例實(shí)現(xiàn)杭攻。 字符串是常量银觅;它們的值在創(chuàng)建之后不能更改团甲。字符串緩沖區(qū)支持可變的字符串惠况。因?yàn)?String 對(duì)象是不可變的娄蔼,所以可以共享。例如:String str = "abc"; //等效于: char data[] = {'a', 'b', 'c'}; String str = new String(data);

概述:

Java 把內(nèi)存劃分成兩種:一種是棧內(nèi)存剖笙,另一種是堆內(nèi)存未妹。在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配呻逆,當(dāng)在一段代碼塊定義一個(gè)變量時(shí),Java 就在棧中為這個(gè)變量分配內(nèi)存空間菩帝,當(dāng)超過(guò)變量的作用域后咖城,Java會(huì)自動(dòng)釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作它用呼奢。

堆內(nèi)存用來(lái)存放由new創(chuàng)建的對(duì)象和數(shù)組宜雀,在堆中分配的內(nèi)存,由Java虛擬機(jī)的自動(dòng)垃圾回收器來(lái)管理握础。在堆中產(chǎn)生了一個(gè)數(shù)組或者對(duì)象之后辐董,還可以在棧中定義一個(gè)特殊的變量,讓棧中的這個(gè)變量的取值等于數(shù)組或?qū)ο笤诙褍?nèi)存中的首地址禀综,棧中的這個(gè)變量就成了數(shù)組或?qū)ο蟮囊米兞考蚝妫院缶涂梢栽诔绦蛑惺褂脳V械囊米兞縼?lái)訪問(wèn)堆中的數(shù)組或者對(duì)象,引用變量就相當(dāng)于是為數(shù)組或者對(duì)象起的一個(gè)名稱定枷。

引用變量是普通的變量孤澎,定義時(shí)在棧中分配,引用變量在程序運(yùn)行到其作用域之外后被釋放欠窒。而數(shù)組和對(duì)象本身在堆中分配覆旭,即使程序運(yùn)行到使用 new 產(chǎn)生數(shù)組或者對(duì)象的語(yǔ)句所在的代碼塊之外,數(shù)組和對(duì)象本身占據(jù)的內(nèi)存不會(huì)被釋放岖妄,數(shù)組和對(duì)象在沒(méi)有引用變量指向它的時(shí)候型将,才變?yōu)槔荒茉诒皇褂眉雠埃匀徽紦?jù)內(nèi)存空間不放七兜,在隨后的一個(gè)不確定的時(shí)間被垃圾回收器收走(釋放掉)。這也是Java比較占內(nèi)存的原因缚俏。

實(shí)際上惊搏,棧中的變量指向堆內(nèi)存中的變量贮乳,這就是Java中的指針!

String類是一個(gè)很特殊的類恬惯,它本身是final的向拆,它是不可變的,String類是的本質(zhì)是字符數(shù)組char[], 并且其值不可改變,但StringBuilder也是final酪耳,為什么StringBuilder是可變的呢浓恳? 究其原因,String類的內(nèi)部是char[]數(shù)組構(gòu)成碗暗,而String的加號(hào)(+)運(yùn)算符的底層是由StringBuilder實(shí)現(xiàn)的颈将,一個(gè)String每次“+“上一個(gè)String,都會(huì)創(chuàng)建一個(gè)新的StringBuilder,然后調(diào)用它的append()方法言疗,該方法返回一個(gè)新形成的String晴圾。所以字符串的一些合并操作可以使用StringBuilder來(lái)提高效率。

用new String()創(chuàng)建的字符串不是常量噪奄,不能在編譯期就確定死姚,而因?yàn)镾tring是類,所以new String()創(chuàng)建的字符串不放入常量池中勤篮,它們有自己的地址空間都毒。即Java中,只要使用new關(guān)鍵字來(lái)創(chuàng)建對(duì)象碰缔,則一定會(huì)(在堆區(qū)或棧區(qū))創(chuàng)建一個(gè)新的對(duì)象账劲。而直接初始化則會(huì)形成字符串常量,分配到運(yùn)行時(shí)常量池中金抡,這會(huì)在編譯時(shí)確定瀑焦。

JAVA String中null和""的區(qū)別String str; String str = null; String str = "";三種定義的區(qū)別:1,聲明一字符串對(duì)象 2竟终,定義一空字符串對(duì)象 3蝠猬,創(chuàng)建一個(gè)字符串為空的字符串對(duì)象

//定義后在后面程序判斷時(shí)用if(str == null || str == ""){} public class Test{ static String str1;//成員變量自動(dòng)賦值 null public static void main(String[] args){ String str;//方法變量 不會(huì)賦值,需要顯式賦值 System.out.print(str1+" "+str);//str1輸出值為null str則會(huì)編譯不通過(guò) } }

方法:

intern

常量池在運(yùn)行期被JVM裝載后,是可以擴(kuò)充的统捶。String的intern()方法就是擴(kuò)充常量池的一個(gè)方法榆芦;當(dāng)一個(gè)String實(shí)例str調(diào)用intern()方法時(shí),Java查找常量池中是否有相同Unicode的字符串常量喘鸟,如果有匆绣,則返回其的引用,如果沒(méi)有什黑,則在常量池中增加一個(gè)Unicode等于str的字符串并返回它的引用崎淳;看下面的例子就清楚了

String s0= "kvill"; String s1=new String("kvill"); String s2=new String("kvill"); System.out.println( s0==s1 ); System.out.println( "**" ); s1.intern(); s2=s2.intern(); //把常量池中"kvill"的引用賦給s2 System.out.println( s0==s1); System.out.println( s0==s1.intern() ); System.out.println( s0==s2 );結(jié)果為:

false

false //雖然執(zhí)行了s1.intern(),但它的返回值沒(méi)有賦給s1 true //說(shuō)明s1.intern()返回的是常量池中"kvill"的引用 true

其他方法:

獲取方法

char charAt(int index) //根據(jù)位置獲取某個(gè)字符

char ch="abc";ch.charAt(1);// 返回'b'

int indexOf(int ch) //返回的是ch在字符串中第一次出現(xiàn)的位置

int indexOf(int ch,int fromIndex) //從fromIndex指定位置開(kāi)始愕把,獲取ch在字符串中第一次出現(xiàn)的位置

int indexOf(String str)

int indexOf(String str,int fromIndex)

int lastIndexOf(int ch)

判斷方法

boolean contains(String str) //另一種判斷方法:

if(str.index(str)!=-1)

boolean startsWith(String str)和boolean endsWith(String str)

bolean isEmpty(String str)

boolean equals(String str)//和==//equals()方法比較字符串對(duì)象中的字符拣凹,==運(yùn)算符比較兩個(gè)對(duì)象是否引用同一實(shí)例森爽。 String s1="Hello"; String s2=new String(s1); s1.eauals(s2); //true s1==s2;//falseboolean equalsIgnoreCase(String str);忽略大小寫(xiě)的比較

轉(zhuǎn)換方法

?將字符數(shù)組轉(zhuǎn)換為字符串

構(gòu)造函數(shù)

String(char[] chs) String(char[] chs,offset,count)將字符數(shù)組中的一部分轉(zhuǎn)成字符串。

靜態(tài)方法

static String copyValueOf(char[] chs)

static String copyValueOf(char[] chs,int offset,int count)

static String valueOf(char[] )

static String valueOf(char[] chs,int offset,int count)

?將字符串轉(zhuǎn)換成字符數(shù)組 char[] toCharArray

?將字符數(shù)組轉(zhuǎn)換成字符串

?將字符串轉(zhuǎn)換成字節(jié)數(shù)組 byte[] toBytes

替換方法

String replace(olderStr,newStr)

切割截取方法

String split(regex)

void getChars(int sourceStart,int sourceEnd,char target[],int targetStart)

sourceStart指定了子串開(kāi)始字符的下標(biāo)嚣镜,sourceEnd指定了子串結(jié)束后的下一個(gè)字符的下標(biāo)爬迟。因此,子串包含從sourceStart到sourceEnd-1的字符菊匿。接收字符的數(shù)組由target指定付呕,target中開(kāi)始復(fù)制子串的下標(biāo)值是targetStart。String s="this is a demo of the getChars method."; char buf[]=new char[20];s.getChars(10,14,buf,0);

獲取子串

String subString(begin)

String subString(begin,end)包含頭不包含尾

將字符串轉(zhuǎn)換成大小寫(xiě)

String toUpperCase()和String toLowerCase()

將字符串兩端的空格去除 String trim()

對(duì)兩個(gè)字符串進(jìn)行自然順序的比較 int compareTo(String str)

concat() 連接兩個(gè)字符串

String的亂碼解決:

--TODO

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跌捆,一起剝皮案震驚了整個(gè)濱河市徽职,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佩厚,老刑警劉巖姆钉,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抄瓦,居然都是意外死亡育韩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門闺鲸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人埃叭,你說(shuō)我怎么就攤上這事摸恍。” “怎么了赤屋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵立镶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我类早,道長(zhǎng)媚媒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任涩僻,我火速辦了婚禮缭召,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逆日。我一直安慰自己嵌巷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布室抽。 她就那樣靜靜地躺著搪哪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坪圾。 梳的紋絲不亂的頭發(fā)上晓折,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天惑朦,我揣著相機(jī)與錄音,去河邊找鬼漓概。 笑死漾月,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的垛耳。 我是一名探鬼主播栅屏,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼堂鲜!你這毒婦竟也來(lái)了栈雳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缔莲,失蹤者是張志新(化名)和其女友劉穎哥纫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體痴奏,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛀骇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了读拆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擅憔。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖檐晕,靈堂內(nèi)的尸體忽然破棺而出暑诸,到底是詐尸還是另有隱情,我是刑警寧澤辟灰,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布个榕,位于F島的核電站,受9級(jí)特大地震影響芥喇,放射性物質(zhì)發(fā)生泄漏西采。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一继控、第九天 我趴在偏房一處隱蔽的房頂上張望械馆。 院中可真熱鬧,春花似錦湿诊、人聲如沸狱杰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)仿畸。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間错沽,已是汗流浹背簿晓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留千埃,地道東北人憔儿。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像放可,于是被迫代替她去往敵國(guó)和親谒臼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

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

  • package day05; import java.util.Arrays; public class Demo...
    殤青澀年華瘋子的明天閱讀 811評(píng)論 0 1
  • 日期:2017-10-02 今天10月2日耀里,昨天去千燈古鎮(zhèn)游玩了一天蜈缤,今天打算復(fù)習(xí)一下String類 地點(diǎn):上海市...
    起風(fēng)了dzj閱讀 597評(píng)論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法冯挎,內(nèi)部類的語(yǔ)法底哥,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法房官,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,662評(píng)論 18 399
  • 一趾徽、String 類 1、定義: 1翰守、從概念上講孵奶,java字符串就是Unicode字符序列。每個(gè)用雙引號(hào)括起來(lái)的字...
    玉圣閱讀 1,579評(píng)論 0 1
  • 每個(gè)人都有小心思蜡峰,為自己拒课,為閨密朋友,到了大學(xué)以后事示,遠(yuǎn)離家鄉(xiāng),慢慢的忙碌了起來(lái)僻肖,漸漸的忘了家鄉(xiāng)肖爵,忘了父母的模樣,我...
    冉瑩閱讀 252評(píng)論 0 1