String/final/StringBuffer

final關(guān)鍵字(最終)

final修飾的類無法被繼承.

final修飾的方法無法被覆蓋.

final修飾的局部變量,一旦賦值笨枯,不可再改變.

class A{

public void m1(){

//聲明

final int i;

//第一次賦值

i = 100;

//不能重新賦值

i = 1200;

}}

final修飾的成員變量必須“顯示的”初始化.

class A{

//final修飾的成員變量必須手動(dòng)初始化.

final int i = 100;

//成員

final int k;

//Constructor

A(){

k = 200;

}}

//常量.java規(guī)范中要求所有的常量“大寫”

//常量:值不可再改變的變量.

public static final double PI = 3.14;

深入final

final修飾的引用類型撩独,該引用不可再重新指向其他的java對象夕凝。

但是fianl修飾的引用,該引用指向的對象的屬性是可以修改的奏寨。

public static void main(String[] args){

final Customer c = new Customer("JACK",15);

//c是final的椎咧,無法重新賦值忍法。

//c = new Customer("LUCY",20);//Error

c.name = "李四";

c.age = 25;

System.out.println(c.name);

System.out.println(c.age);

}

(String)java.lang.String;是字符串類型真慢。

1.字符串一旦創(chuàng)建不可再改變毅臊。"abc"字符串對象一旦創(chuàng)建理茎,不可再改變成"abcd"

2.提升字符串的訪問效率:在程序中使用了“緩存”技術(shù)黑界。所以在java中所有使用“雙引號”括起來

的字符串都會(huì)在“字符串常量池”中創(chuàng)建一份。字符串常量池在方法區(qū)中被存儲(chǔ)皂林。

3.在程序執(zhí)行過程中朗鸠,如果程序用到某個(gè)字符串,例如"abc",那么程序會(huì)在字符串常量池

中去搜索該字符串础倍,如果沒有找到則在字符串常量池中新建一個(gè)"abc"字符串烛占,如果找到

就直接拿過來用。(字符串常量池是一個(gè)緩存區(qū)沟启,為了提高訪問字符串的效率)

//創(chuàng)建一個(gè)"abc"字符串對象忆家,該對象的內(nèi)存地址,讓s1變量保存德迹。

//s1是一個(gè)引用芽卿,s1指向 "abc" 對象.

String s1 = "abc";

//可以讓s1重新指向嗎?s1是局部變量,s1前邊沒有final胳搞,所以s1可以重新指向卸例。

//但是"def"字符串本身不可變.

s1 = "def";

String s2 = "Hello"; //在字符串常量池中新建一個(gè)"Hello"字符串對象称杨,該對象不可變

String s3 = "Hello"; //從字符串常量池中直接拿來用。

System.out.println(s2==s3); //true

//比較兩個(gè)字符串是否相等筷转,不能用"=="

String s4 = new String("abc");

String s5 = new String("abc");

System.out.println(s4==s5); //false

//比較兩個(gè)字符串是否一致姑原,必須使用String類提供的equals方法.

System.out.println(s4.equals(s5)); //true

//以下程序執(zhí)行結(jié)束之后,會(huì)在字符串常量池中創(chuàng)建3個(gè)字符串對象

//"aaa" "bbb"? "aaabbb"

String s6 = "aaa";

String s7 = "bbb";

String s8 = s6 + s7;


字符串對象的區(qū)別

1.String s1 = "abc"; 只會(huì)在字符串常量池中創(chuàng)建一個(gè)"abc"字符串對象.

2.String s2 = new String("hello"); 會(huì)在字符串常量池中創(chuàng)建一個(gè)"hello"字符串對象,并且會(huì)在堆中再創(chuàng)建一個(gè)字符串對象呜舒。

第二種方式比較浪費(fèi)內(nèi)存锭汛,常用的是第一種方式。

面試題

//判斷以下程序創(chuàng)建了幾個(gè)對象袭蝗? 3個(gè)

//堆中2個(gè)

//方法區(qū)字符串常量池中1個(gè).

String s1 = new String("Hello");

String s2 = new String("Hello");


使用String的時(shí)候我們應(yīng)該注意的問題:盡量不要做字符串頻繁的拼接操作店乐。

因?yàn)樽址坏﹦?chuàng)建不可改變,只要頻繁拼接呻袭,就會(huì)在字符串常量池中創(chuàng)建

大量的字符串對象眨八,給垃圾回收帶來問題。

String[] ins = {"sport","music","food","sleep"};

//要求將上面的興趣愛好拼接成一個(gè)字符串“sport,music,food,sleep”

String temp = "";

for(int i=0;ins.length; I++){

if(i==ins.length-1){

temp += ins[i];

}else{

temp += ins[i] + ",";

}

}

System.out.println(temp);

字符串常用構(gòu)造方法

//1.String s1 = "abc";

//2.String s2 = new String("abc");

//3.byte[] bytes = {97,98,99,100};

String s3 = new String(bytes);

System.out.println(s3); //abcd? String已經(jīng)重寫了Object中的toString

//4.String s4 = new String(bytes,1,2);

System.out.println(s4); //bc

//5.char[] c1 = {'我','是','中','國','人'};

String s5 = new String(c1);

System.out.println(s5); //我是中國人

//6.String s6 = new String(c1,2,2);

System.out.println(s6); //中國


字符串常用的方法

//1.char charAt(int index);返回指定索引處的char值

String s1 = "我是王勇左电,是壞人廉侧!";

char c1 = s1.charAt(2);System.out.println(c1); //王

//2.boolean endsWith(String endStr);此字符串是否以指定的后綴結(jié)束

System.out.println("HelloWorld.java".endsWith("java")); //true

System.out.println("HelloWorld.java".endsWith("txt")); //false

//3. boolean equalsIgnoreCase(String anotherString);將一個(gè)Str和另一個(gè)str比較,不考慮大小寫

System.out.println("abc".equalsIgnoreCase("ABc")); //true

//4.byte[] getBytes();將字符串轉(zhuǎn)換為byte數(shù)組

byte[] bytes = "abc".getBytes()

//5.int indexOf(String str);判斷此字符串在另一個(gè)字符串第一次出現(xiàn)的索引

System.out.println("http://192.168.1.100:8080/oa/login.action?username=jack&pwd=123".indexOf("/oa"));//25

//6.int indexOf(String str, int fromIndex); 判斷此字符串在另一個(gè)字符串第一次出現(xiàn)的索引篓足,從指定索引開始段誊,

System.out.println("javaoraclec++javavb".indexOf("java",1)); //13

isEmpty()當(dāng)且僅當(dāng)length()為0時(shí)返回true

//7.int lastIndexOf(String str)返回此字符串在此字符串中最右邊出現(xiàn)的索引

System.out.println("javaoraclec++javavb".lastIndexOf("java")); //13

//8.int lastIndexOf(String str, int fromIndex)從指定的索引反向搜索

System.out.println("javaoraclec++javavb".lastIndexOf("java",14)); //13

//9.int length();

System.out.println("abc".length()); //數(shù)組是length屬性,String是length()方法

//10. String replaceAll(String s1,String s2);替換,把java替換成mysql

System.out.println("javaoraclec++javavb".replaceAll("java","mysql")); //這個(gè)程序是4個(gè)字符串//mysqloraclec++mysqlvb

//11.String[] split(String s);

String myTime = "2008,08,08";

String[] ymd = myTime.split(",");以逗號分隔

for(int i=0;ymd.length;i ++){

System.out.println(imd[I]);

}

//12.boolean startsWith(String s);測試此字符串是否以指定的前綴開始

System.out.println("/system/login.action".startsWith("/")); //true

//13.String substring(int begin);截取字符串

System.out.println("/oa/login.action".substring(3)); //? /login.action

//14. String substring(int beginIndex, int endIndex)截取字符串

System.out.println("/oa/login.action".substring(4,9)); //login

//15.char[] toCharArray();將此字符串轉(zhuǎn)換為一個(gè)新的字符串?dāng)?shù)組

char[] c2 = "我是李海波".toCharArray();

//16.轉(zhuǎn)換成大寫

System.out.println("Abcdef".toUpperCase());

//17.轉(zhuǎn)換成小寫

System.out.println("ABCDEf".toLowerCase());

//18.String trim(); 去掉前面空格和后面空格栈拖,但去不掉a后和e前的空格

System.out.print("? ? ? a? bcd e? ? ? ? ? ".trim());

//19.String valueOf(Object obj);返回新的字符串(類型轉(zhuǎn)換)

Object o = null;

System.out.println(o); //不會(huì)连舍,因?yàn)椴⒉皇侵苯诱{(diào)用toString方法,String.valueOf(Object)這個(gè)方法對空值進(jìn)行處理了。

System.out.println(String.valueOf(o));

//System.out.println(o.toString()); //會(huì)出現(xiàn)空指針


java.lang.StringBuffer;

java.lang.StringBuilder;

1.StringBuffer和StringBuilder是什么涩哟?

是一個(gè)字符串緩沖區(qū).

2.工作原理

預(yù)先在內(nèi)存中申請一塊空間索赏,以容納字符序列,

如果預(yù)留的空間不夠用贴彼,則進(jìn)行自動(dòng)擴(kuò)容潜腻,以

容納更多字符序列。

3.StringBuffer,StringBuilder? 和? String最大的區(qū)別器仗?

String是不可變得字符序列融涣,存儲(chǔ)字符串常量池中。

StringBuffer底層是一個(gè)char數(shù)組精钮,但是該char數(shù)組是可變的威鹿。

并且可以自動(dòng)擴(kuò)容。

char中是否可以存儲(chǔ)一個(gè)中文漢字?

解:char底層存儲(chǔ)的是unnicode編碼格式的中文,

只要unnicode編碼中有的中文漢字,就可以在char中聲明

4.StringBuffer和StringBuilder的默認(rèn)初始化容量是16

5.如何優(yōu)化StringBuffer和StringBuilder呢轨香?

最好在創(chuàng)建StringBuffer之前忽你,預(yù)測StringBuffer的存儲(chǔ)字符數(shù)量,

然后再創(chuàng)建StringBuffer的時(shí)候采用指定初始化容量的方式創(chuàng)建StringBuffer.

為了減少底層數(shù)組的拷貝弹沽。提高效率檀夹。

6.StringBuffer和StringBuilder的區(qū)別筋粗?

StringBuffer是線程安全的。(可以在多線程的環(huán)境下使用不會(huì)出現(xiàn)問題.)

StringBuilder是非線程安全的炸渡。(在多線程環(huán)境下使用可能出現(xiàn)問題.)

//創(chuàng)建字符串緩沖區(qū)對象

StringBuffer sb = new StringBuffer(); //16

//可以向StringBuffer中追加字符串.

String[] ins = {"體育","音樂","睡覺","美食"};

//推薦字符串頻繁拼接使用StringBuffer或者StringBuilder

for(int i = 0; I<ins.length;i ++){

if(i==ins.length-1){

sb.append(ins[i]);

}else{

sb.append(ins[i]);

sb.append(",");

}

System.out.println(sb);

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末娜亿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蚌堵,更是在濱河造成了極大的恐慌买决,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼畏,死亡現(xiàn)場離奇詭異督赤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泻蚊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門躲舌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人性雄,你說我怎么就攤上這事没卸。” “怎么了秒旋?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵约计,是天一觀的道長。 經(jīng)常有香客問我迁筛,道長煤蚌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任细卧,我火速辦了婚禮尉桩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酒甸。我一直安慰自己魄健,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布插勤。 她就那樣靜靜地躺著,像睡著了一般革骨。 火紅的嫁衣襯著肌膚如雪农尖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天良哲,我揣著相機(jī)與錄音盛卡,去河邊找鬼。 笑死筑凫,一個(gè)胖子當(dāng)著我的面吹牛滑沧,可吹牛的內(nèi)容都是我干的并村。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼滓技,長吁一口氣:“原來是場噩夢啊……” “哼哩牍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起令漂,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤膝昆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后叠必,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荚孵,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年纬朝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了收叶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡共苛,死狀恐怖滔驾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俄讹,我是刑警寧澤哆致,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站患膛,受9級特大地震影響摊阀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踪蹬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一胞此、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跃捣,春花似錦漱牵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至娶聘,卻和暖如春闻镶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丸升。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工铆农, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狡耻。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓墩剖,卻偏偏與公主長得像猴凹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子岭皂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法郊霎,類相關(guān)的語法,內(nèi)部類的語法蒲障,繼承相關(guān)的語法歹篓,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等揉阎,對于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,497評論 0 3
  • java中String的常用方法 1庄撮、length()字符串的長度 例:char chars[]={'a','b'...
    赤赤有名閱讀 2,052評論 0 10
  • [TOC] StringBuffer類 StringBuffer類概述及其構(gòu)造方法 StringBuffer類概述...
    lutianfei閱讀 466評論 0 1
  • 兵哥昨天發(fā)出的《張兵:如何用思維導(dǎo)圖準(zhǔn)備嬰幼兒購物清單》很受歡迎。 今天兵哥繼續(xù)與大家分享毙籽,如何用思維導(dǎo)圖做寶貝出...
    思維導(dǎo)圖閱讀 406評論 1 0