JAVA String類

JAVA Doc

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

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

概述:

Java 把內(nèi)存劃分成兩種:一種是棧內(nèi)存,另一種是堆內(nèi)存。在函數(shù)中定義的一些基本類型的變量和對象的引用變量都是在函數(shù)的棧內(nèi)存中分配,當在一段代碼塊定義一個變量時,Java 就在棧中為這個變量分配內(nèi)存空間,當超過變量的作用域后,Java會自動釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間可以立即被另作它用。

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

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

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

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

用new String()創(chuàng)建的字符串不是常量,不能在編譯期就確定,而因為String是類,所以new String()創(chuàng)建的字符串不放入常量池中,它們有自己的地址空間。即Java中,只要使用new關鍵字來創(chuàng)建對象,則一定會(在堆區(qū)或棧區(qū))創(chuàng)建一個新的對象。而直接初始化則會形成字符串常量,分配到運行時常量池中,這會在編譯時確定。

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

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

方法:

intern

常量池在運行期被JVM裝載后,是可以擴充的。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調(diào)用intern()方法時,Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個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(),但它的返回值沒有賦給s1 true //說明s1.intern()返回的是常量池中"kvill"的引用 true

其他方法:

獲取方法

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

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

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

int indexOf(int ch,int fromIndex) //從fromIndex指定位置開始,獲取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()方法比較字符串對象中的字符,==運算符比較兩個對象是否引用同一實例。 String s1="Hello"; String s2=new String(s1); s1.eauals(s2); //true s1==s2;//falseboolean equalsIgnoreCase(String str);忽略大小寫的比較

轉(zhuǎn)換方法

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

構造函數(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指定了子串開始字符的下標,sourceEnd指定了子串結(jié)束后的下一個字符的下標。因此,子串包含從sourceStart到sourceEnd-1的字符。接收字符的數(shù)組由target指定,target中開始復制子串的下標值是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)換成大小寫

String toUpperCase()和String toLowerCase()

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

對兩個字符串進行自然順序的比較 int compareTo(String str)

concat() 連接兩個字符串

String的亂碼解決:

--TODO

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

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

  • package day05; import java.util.Arrays; public class Demo...
    殤青澀年華瘋子的明天閱讀 820評論 0 1
  • 日期:2017-10-02 今天10月2日,昨天去千燈古鎮(zhèn)游玩了一天,今天打算復習一下String類 地點:上海市...
    起風了dzj閱讀 602評論 0 1
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,717評論 18 399
  • 一、String 類 1、定義: 1、從概念上講,java字符串就是Unicode字符序列。每個用雙引號括起來的字...
    玉圣閱讀 1,589評論 0 1
  • 每個人都有小心思,為自己,為閨密朋友,到了大學以后,遠離家鄉(xiāng),慢慢的忙碌了起來,漸漸的忘了家鄉(xiāng),忘了父母的模樣,我...
    冉瑩閱讀 254評論 0 1