青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Merlin

Life was like a box of chocolates. You never know what you're gonna get.

   :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  34 隨筆 :: 0 文章 :: 40 評(píng)論 :: 0 Trackbacks
近期到CSDN論壇看看一些網(wǎng)友貼的面試題,其中關(guān)于String的問(wèn)題常常被提及。我一直以為自己很清楚這個(gè)東西了,其實(shí)深究起來(lái),發(fā)現(xiàn)自己并不那么清楚,會(huì)犯一些錯(cuò)誤;同時(shí)也產(chǎn)生了一些聯(lián)想。小結(jié)一下。

1、"abc"與new String("abc");
????經(jīng)常會(huì)問(wèn)到的面試題:String s = new String("abc");創(chuàng)建了幾個(gè)String Object?【如這里創(chuàng)建了多少對(duì)象? 和一道小小的面試題 】

????這個(gè)問(wèn)題比較簡(jiǎn)單,涉及的知識(shí)點(diǎn)包括:

引用變量與對(duì)象的區(qū)別;
字符串文字"abc"是一個(gè)String對(duì)象;
文字池[pool of literal strings]和堆[heap]中的字符串對(duì)象。
????一、引用變量與對(duì)象:除了一些早期的Java書籍和現(xiàn)在的垃圾書籍,人們都可以從中比較清楚地學(xué)習(xí)到兩者的區(qū)別。A aa;語(yǔ)句聲明一個(gè)類A的引用變量aa[我常常稱之為句柄],而對(duì)象一般通過(guò)new創(chuàng)建。所以題目中s僅僅是一個(gè)引用變量,它不是對(duì)象。[ref 句柄、引用與對(duì)象]

????二、Java中所有的字符串文字[字符串常量]都是一個(gè)String的對(duì)象。有人[特別是C程序員]在一些場(chǎng)合喜歡把字符串"當(dāng)作/看成"字符數(shù)組,這也沒有辦法,因?yàn)樽址c字符數(shù)組存在一些內(nèi)在的聯(lián)系。事實(shí)上,它與字符數(shù)組是兩種完全不同的對(duì)象。

????????System.out.println("Hello".length());
????????char[] cc={'H','i'};
????????System.out.println(cc.length);

????三、字符串對(duì)象的創(chuàng)建:由于字符串對(duì)象的大量使用[它是一個(gè)對(duì)象,一般而言對(duì)象總是在heap分配內(nèi)存],Java中為了節(jié)省內(nèi)存空間和運(yùn)行時(shí)間[如比較字符串時(shí),==比equals()快],在編譯階段就把所有的字符串文字放到一個(gè)文字池[pool of literal strings]中,而運(yùn)行時(shí)文字池成為常量池的一部分。文字池的好處,就是該池中所有相同的字符串常量被合并,只占用一個(gè)空間。我們知道,對(duì)兩個(gè)引用變量,使用==判斷它們的值[引用]是否相等,即指向同一個(gè)對(duì)象:

				String s1 = "abc" ;
String s2 = "abc" ;
if( s1 == s2 )
????System.out.println("s1,s2 refer to the same object");
else???? System.out.println("trouble");


????這里的輸出顯示,兩個(gè)字符串文字保存為一個(gè)對(duì)象。就是說(shuō),上面的代碼只在pool中創(chuàng)建了一個(gè)String對(duì)象。

????現(xiàn)在看String s = new String("abc");語(yǔ)句,這里"abc"本身就是pool中的一個(gè)對(duì)象,而在運(yùn)行時(shí)執(zhí)行new String()時(shí),將pool中的對(duì)象復(fù)制一份放到heap中,并且把heap中的這個(gè)對(duì)象的引用交給s持有。ok,這條語(yǔ)句就創(chuàng)建了2個(gè)String對(duì)象。

				String s1 = new String("abc") ;
String s2 = new String("abc") ;
if( s1 == s2 ){ //不會(huì)執(zhí)行的語(yǔ)句}


????這時(shí)用==判斷就可知,雖然兩個(gè)對(duì)象的"內(nèi)容"相同[equals()判斷],但兩個(gè)引用變量所持有的引用不同,

????BTW:上面的代碼創(chuàng)建了幾個(gè)String Object? [三個(gè),pool中一個(gè),heap中2個(gè)。]
????[Java2 認(rèn)證考試學(xué)習(xí)指南 (第4版)( 英文版)p197-199有圖解。]


2、字符串的+運(yùn)算和字符串轉(zhuǎn)換
????字符串轉(zhuǎn)換和串接是很基礎(chǔ)的內(nèi)容,因此我以為這個(gè)問(wèn)題簡(jiǎn)直就是送分題。事實(shí)上,我自己就答錯(cuò)了。

String str = new String("jf"); // jf是接分
str = 1+2+str+3+4;
一共創(chuàng)建了多少String的對(duì)象?[我開始的答案:5個(gè)。jf、new、3jf、3jf3、3jf34]

????首先看JLS的有關(guān)論述:

????一、字符串轉(zhuǎn)換的環(huán)境[JLS 5.4 String Conversion]

????字符串轉(zhuǎn)換環(huán)境僅僅指使用雙元的+運(yùn)算符的情況,其中一個(gè)操作數(shù)是一個(gè)String對(duì)象。在這一特定情形下,另一操作數(shù)轉(zhuǎn)換成String,表達(dá)式的結(jié)果是這兩個(gè)String的串接。

????二、串接運(yùn)算符[JLS 15.18.1 String Concatenation Operator + ]

????如果一個(gè)操作數(shù)/表達(dá)式是String類型,則另一個(gè)操作數(shù)在運(yùn)行時(shí)轉(zhuǎn)換成一個(gè)String對(duì)象,并兩者串接。此時(shí),任何類型都可以轉(zhuǎn)換成String。[這里,我漏掉了"3"和"4"]

如果是基本數(shù)據(jù)類型,則如同首先轉(zhuǎn)換成其包裝類對(duì)象,如int x視為轉(zhuǎn)換成Integer(x)。
現(xiàn)在就全部統(tǒng)一到引用類型向String的轉(zhuǎn)換了。這種轉(zhuǎn)換如同[as if]調(diào)用該對(duì)象的無(wú)參數(shù)toString方法。[如果是null則轉(zhuǎn)換成"null"]。因?yàn)閠oString方法在Object中定義,故所有的類都有該方法,而且Boolean, Character, Integer, Long, Float, Double, and String改寫了該方法。
關(guān)于+是串接還是加法,由操作數(shù)決定。1+2+str+3+4 就很容易知道是"3jf34"。[BTW :在JLS的15.18.1.3中舉的一個(gè)jocular little example,真的很無(wú)趣。]
????下面的例子測(cè)試了改寫toString方法的情況.。

				class A{
????int i = 10;
????public static void main(String []args){
????????String str = new String("jf");
????????str += new A();
????????System.out.print(str);
????}

????public String toString(){
????????return " a.i ="+i+"\n";
????}
}


三、字符串轉(zhuǎn)換的優(yōu)化

按照上述說(shuō)法,str = 1+2+str+3+4;語(yǔ)句似乎應(yīng)該就應(yīng)該生成5個(gè)String對(duì)象:

1+2 =3,then 3→Integer(3)→"3" in pool? [假設(shè)如此]
"3"+str(in heap) = "3jf"???? (in heap)
"3jf" +3 ,first 3→Integer(3)→"3" in pool? [則不創(chuàng)建] then "3jf3"
"3jf3"+4 create "4"??in pool
then "3jf34"

????這里我并不清楚3、4轉(zhuǎn)換成字符串后是否在池中,所以上述結(jié)果仍然是猜測(cè)。

????為了減少創(chuàng)建中間過(guò)渡性的字符串對(duì)象,提高反復(fù)進(jìn)行串接運(yùn)算時(shí)的性能,a Java compiler可以使用StringBuffer或者類似的技術(shù),或者把轉(zhuǎn)換與串接合并成一步。例如:對(duì)于 a + b + c ,Java編譯器就可以將它視為[as if]

????new StringBuffer().append(a).append(b).append(c).toString();

????注意,對(duì)于基本類型和引用類型,在append(a)過(guò)程中仍然要先將參數(shù)轉(zhuǎn)換,從這個(gè)觀點(diǎn)看,str = 1+2+str+3+4;創(chuàng)建的字符串可能是"3"、"4"和"3jf34"[以及一個(gè)StringBuffer對(duì)象]。

????現(xiàn)在我仍然不知道怎么回答str = 1+2+str+3+4;創(chuàng)建了多少String的對(duì)象,。或許,這個(gè)問(wèn)題不需要過(guò)于研究,至少SCJP不會(huì)考它。

3、這又不同:str = "3"+"jf"+"3"+"4";
????如果是一個(gè)完全由字符串文字組成的表達(dá)式,則在編譯時(shí),已經(jīng)被優(yōu)化而不會(huì)在運(yùn)行時(shí)創(chuàng)建中間字符串。測(cè)試代碼如下:

				String str1 ="3jf34";
????????String str2 ="3"+"jf"+"3"+"4";
????????if(str1 == str2) {
????????????System.out.println("str1 == str2");
????????}else {
????????????System.out.println("think again");
????????}
????????if(str2.equals(str1))
????????????System.out.println("yet str2.equals(str1)");


????可見,str1與str2指向同一個(gè)對(duì)象,這個(gè)對(duì)象在pool中。所有遵循Java Language Spec的編譯器都必須在編譯時(shí)對(duì)constant expressions 進(jìn)行簡(jiǎn)化。JLS規(guī)定:Strings computed by constant expressions (ý15.28) are computed at compile time and then treated as if they were literals.

????對(duì)于String str2 ="3"+"jf"+"3"+"4";我們說(shuō)僅僅創(chuàng)建一個(gè)對(duì)象。注意,“創(chuàng)建多少對(duì)象”的討論是說(shuō)運(yùn)行時(shí)創(chuàng)建多少對(duì)象。

????BTW:編譯時(shí)優(yōu)化

				????String x = "aaa " + "bbb ";
????if (false) {
????????x = x + "ccc ";
????}
????x +=??"ddd ";

????等價(jià)于:

????String x = "aaa bbb ";
????x = x + "ddd ";
//這個(gè)地方我自己進(jìn)行了編譯,不過(guò)和他的結(jié)論不一樣,好像當(dāng)用x+="ddd"的時(shí)候和直接的x="aaa"+"bbb"+"ddd" 不同,但是具體為什么我也不清楚,正在研究中。。。

4、不變類
????String對(duì)象是不可改變的(immutable)。有人對(duì)str = 1+2+str+3+4;語(yǔ)句提出疑問(wèn),怎么str的內(nèi)容可以改變?其實(shí)仍然是因?yàn)椴磺宄阂米兞颗c對(duì)象的區(qū)別。str僅僅是引用變量,它的值——它持有的引用可以改變。你不停地創(chuàng)建新對(duì)象,我就不斷地改變指向。[參考TIJ的Read-only classes。]

????不變類的關(guān)鍵是,對(duì)于對(duì)象的所有操作都不可能改變?cè)瓉?lái)的對(duì)象[只要需要,就返回一個(gè)改變了的新對(duì)象]。這就保證了對(duì)象不可改變。為什么要將一個(gè)類設(shè)計(jì)成不變類?有一個(gè)OOD設(shè)計(jì)的原則:Law of Demeter。其廣義解讀是:

????使用不變類。只要有可能,類應(yīng)當(dāng)設(shè)計(jì)為不變類。
posted on 2006-07-11 22:29 Merlin 閱讀(406) 評(píng)論(0)  編輯 收藏 引用 所屬分類: java基礎(chǔ)篇
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久xxxx精品视频| 午夜国产精品视频免费体验区| 亚洲精品国产品国语在线app| 久久久女女女女999久久| 亚洲日本欧美日韩高观看| 欧美影院在线播放| 亚洲欧美文学| 禁断一区二区三区在线| 亚洲一区二区在线| 欧美在线视频a| 在线欧美电影| 国产日韩精品久久| 99视频+国产日韩欧美| 午夜一区二区三视频在线观看| 欧美精品三级日韩久久| 一区二区欧美视频| 午夜一区二区三视频在线观看| 欧美日韩大片| 亚洲欧美日韩国产一区二区| 另类尿喷潮videofree| 国产一区日韩一区| 欧美日韩综合在线免费观看| 亚洲欧美日韩精品久久亚洲区| 久久国产精品一区二区三区四区| 国产一区二区三区免费在线观看| 国产精品羞羞答答xxdd| 亚洲欧洲日韩女同| 欧美成人黑人xx视频免费观看| 嫩草影视亚洲| 久久成人资源| 欧美亚洲在线观看| 99re8这里有精品热视频免费| 国产精品美女久久| 国产精品日本| 国产精品久久久久久久久久久久久久 | 一区二区三区产品免费精品久久75 | 久久久久免费视频| 99re6这里只有精品视频在线观看| 亚洲国产一区视频| 美女在线一区二区| 亚洲电影有码| 一本大道久久a久久精二百| 亚洲欧洲一区二区在线观看| 免费日韩av| 久久se精品一区精品二区| 亚洲免费av片| 欧美国产日本高清在线| 午夜精品久久久久久久蜜桃app| 亚洲激情偷拍| 欧美高清视频一二三区| 国产精品久久久久久久app| 欧美性大战久久久久久久蜜臀| 欧美日韩国产综合视频在线观看中文 | 欧美片第1页综合| 国产精品亚洲成人| 依依成人综合视频| 久久国产精品色婷婷| 久久精品久久99精品久久| 欧美成人精品三级在线观看| 亚洲高清久久| 亚洲天堂网在线观看| 久久这里有精品视频| 欧美日本亚洲韩国国产| 国产伦理一区| 亚洲欧美成人一区二区三区| 久久尤物视频| 欧美在线播放高清精品| 欧美专区日韩专区| 国产精品国产一区二区| 亚洲社区在线观看| 老司机精品久久| 亚洲视频一区| 欧美精品激情| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲美女视频在线免费观看| 免费av成人在线| 欧美成年人网| 免费日韩成人| avtt综合网| 亚洲九九九在线观看| 亚洲综合欧美| 欧美视频日韩视频在线观看| 激情欧美日韩| 亚洲第一二三四五区| 免播放器亚洲一区| 亚洲日韩视频| 欧美一区二区三区免费看| 欧美视频一区二区三区在线观看| 久久se精品一区二区| 久久久久久综合| 亚洲免费精彩视频| 久久精品国产免费| 99国产精品久久久| 亚洲男女毛片无遮挡| 国产精品久久国产愉拍| 免费不卡视频| 亚洲精品国产日韩| 久久性色av| 午夜精品福利在线观看| 欧美精品在线观看一区二区| 欧美成人免费全部观看天天性色| 国产精品扒开腿爽爽爽视频 | 欧美大片91| 日韩视频在线一区二区| 欧美日韩国产首页| 亚洲欧洲日本mm| 国产日韩欧美精品综合| 久久人人九九| 日韩午夜在线电影| 久久国产精品99精品国产| 宅男噜噜噜66一区二区| 久久裸体视频| 欧美精品一区二区高清在线观看| 久久亚洲欧美| 伊人久久大香线| 久久亚洲精品伦理| 午夜精品久久久久久99热| 激情国产一区二区| 久久精品一级爱片| 欧美激情精品久久久久久| 欧美天天视频| 亚洲欧美日韩成人| 欧美亚洲一区二区三区| 欧美图区在线视频| 欧美日韩高清免费| 日韩一区二区精品| 亚洲视频图片小说| 欧美三日本三级三级在线播放| 在线一区二区三区做爰视频网站| 亚洲欧洲另类国产综合| 国产一区二区三区成人欧美日韩在线观看| 欧美美女操人视频| 久久综合久久综合这里只有精品 | 国模一区二区三区| 免费观看在线综合色| 91久久综合| 欧美亚洲一区二区在线| 一区二区三区高清视频在线观看 | 欧美激情 亚洲a∨综合| 亚洲黄色成人久久久| 久久精品亚洲一区二区三区浴池 | 亚洲作爱视频| 国产综合香蕉五月婷在线| 亚洲午夜电影| 亚洲女性喷水在线观看一区| 午夜欧美视频| 久久精品女人的天堂av| 午夜精品999| 亚洲永久在线观看| 久久综合九色| 亚洲国产精选| 亚洲日本久久| 欧美一区综合| 欧美成年视频| 国产精品一区二区三区乱码| 国产精品美女视频网站| 欧美亚州一区二区三区| 国产区精品在线观看| 欧美日韩亚洲91| 国产一区二区三区网站| 国产精品国产精品| 亚洲国产另类久久精品| 亚洲欧美综合国产精品一区| 久久久精品一区| 久久成人精品电影| 免费观看久久久4p| 亚洲综合第一| 久久久噜噜噜久久人人看| 国产欧美一区视频| 亚洲一区成人| 亚洲精品日韩激情在线电影| 亚洲精品在线二区| 久久性天堂网| 国产亚洲精品高潮| 亚洲一区日韩| 亚洲欧洲日产国码二区| 欧美激情一区二区三区全黄| 国产欧美日韩一级| 久久精品免费观看| 欧美**人妖| 国产亚洲成年网址在线观看| 亚洲在线视频观看| 亚洲一区二区三区乱码aⅴ| 免费在线亚洲欧美| 亚洲国产精品一区二区久| 国产日韩一区二区三区| 午夜亚洲福利| 亚洲国产精品成人一区二区 | 国产精品黄色在线观看| 正在播放欧美视频| 亚洲一区二区三区精品在线| 国产日韩欧美| 欧美激情视频给我| 国产精品爽爽ⅴa在线观看| 久久激情网站| 欧美一区二区三区四区视频| 亚洲精品孕妇| 亚洲精品乱码久久久久久按摩观| 欧美日韩美女| 另类人畜视频在线|