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

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>
            老司机免费视频久久| 在线亚洲伦理| 国产亚洲欧美另类中文 | 久久久久国产精品人| 免费不卡亚洲欧美| 国产精品久在线观看| 亚洲黄一区二区| 久久亚洲不卡| 亚洲一区二区三区欧美 | 亚洲自拍另类| 欧美激情一区在线| 樱花yy私人影院亚洲| 亚洲你懂的在线视频| 亚洲国产乱码最新视频| 午夜一区不卡| 国产精品激情电影| 99ri日韩精品视频| 欧美高清视频一区二区三区在线观看 | 亚洲影院高清在线| 欧美色欧美亚洲另类七区| 亚洲国产天堂久久综合网| 日韩视频免费观看高清完整版| 免费人成网站在线观看欧美高清| 久久国产日韩欧美| 欧美性色综合| 亚洲欧美成人一区二区在线电影 | 久久久青草青青国产亚洲免观| 亚洲深夜激情| 一区二区三区日韩精品视频| 99国产欧美久久久精品| 男人的天堂亚洲| 国内精品视频666| 久久国产精品久久w女人spa| 亚洲欧美日韩国产成人| 免费视频亚洲| 国产亚洲成人一区| 久久高清一区| 久久www成人_看片免费不卡| 狠狠色狠狠色综合系列| 美女网站在线免费欧美精品| 久久影视三级福利片| 国产精品videosex极品| 亚洲一卡二卡三卡四卡五卡| 一区二区欧美视频| 麻豆成人av| 日韩亚洲国产精品| 一本久道综合久久精品| 欧美国产精品劲爆| 精品二区视频| 亚洲丁香婷深爱综合| 欧美国产日韩一区| 亚洲高清视频在线| 亚洲精品一区在线观看香蕉| 狂野欧美激情性xxxx欧美| 亚洲国产高清在线观看视频| 亚洲人成网站777色婷婷| 欧美性大战久久久久久久| 欧美亚洲日本网站| 久久国产日韩| 日韩一区二区精品| 在线亚洲欧美专区二区| 国产日韩精品久久| 欧美激情精品久久久| 欧美日韩成人精品| 欧美一区中文字幕| 欧美91大片| 午夜亚洲性色福利视频| 久久婷婷av| 午夜在线成人av| 美女精品国产| 一区二区三区成人| 国产日韩一区二区三区| 亚洲色诱最新| 国产精品素人视频| 99天天综合性| 在线免费不卡视频| 亚洲免费在线观看视频| 亚洲欧美日韩国产成人| 国产欧美va欧美va香蕉在| 亚洲女性裸体视频| 一本色道久久88亚洲综合88| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩在线看| 久久久欧美精品sm网站| 欧美日韩精品系列| 久久久久久久久久看片| 欧美连裤袜在线视频| 久久视频在线视频| 欧美午夜宅男影院在线观看| 久久只精品国产| 蜜臀av一级做a爰片久久| 欧美专区亚洲专区| 欧美日韩中文字幕在线| 美女精品在线观看| 国产模特精品视频久久久久| 亚洲七七久久综合桃花剧情介绍| 国内综合精品午夜久久资源| 亚洲视频你懂的| 中文无字幕一区二区三区| 欧美成人影音| 国产亚洲福利| 亚洲一区国产一区| 日韩一区二区精品| 欧美成人资源网| 久久手机免费观看| 国产视频一区在线观看| 亚洲一区亚洲| 亚洲在线观看视频网站| 久久全国免费视频| 亚洲一区中文| 国产精品国产三级国产专播品爱网| 亚洲国产精品久久久久久女王| 在线成人性视频| 欧美一级视频| 久久精品亚洲一区二区三区浴池| 国产精品久久国产愉拍| 亚洲精品一区在线观看| 亚洲国产专区| 亚洲一区二区视频在线观看| 精品不卡在线| 久热成人在线视频| 亚洲第一视频网站| 日韩视频在线一区二区三区| 欧美激情一区二区三级高清视频| 91久久精品国产91久久| 一区二区三区 在线观看视| 国产精品xxx在线观看www| 亚洲天堂av在线免费| 欧美一二三区在线观看| 国产一区二区主播在线| 久久久噜噜噜久久狠狠50岁| 久久久国产精品亚洲一区 | 麻豆视频一区二区| 欧美激情导航| 亚洲乱码国产乱码精品精可以看| 巨胸喷奶水www久久久免费动漫| 欧美国产日韩a欧美在线观看| 国产在线精品二区| 欧美成人午夜77777| 欧美国产一区二区三区激情无套| 欧美国产综合一区二区| 亚洲天堂黄色| 久久综合久久综合久久| 亚洲国产日日夜夜| 欧美视频1区| 久久国产精品99久久久久久老狼| 欧美一区二区三区久久精品| 在线观看国产欧美| 欧美人与性动交cc0o| 亚洲精品一区二区三区福利| 久久国产精品黑丝| 一本大道久久精品懂色aⅴ| 国产视频精品网| 欧美激情中文字幕一区二区| 亚洲午夜视频在线观看| 女生裸体视频一区二区三区| 亚洲视频第一页| 伊人久久亚洲热| 欧美午夜在线观看| 美日韩精品免费| 午夜国产一区| 亚洲激情偷拍| 久久国产精品久久久久久| 永久免费视频成人| 国产精品高精视频免费| 久久久久久久久久久久久9999| 一本久久a久久免费精品不卡| 久久综合网络一区二区| 亚洲视频中文字幕| 亚洲成人在线视频网站| 国产精品久久久久久久午夜 | 亚洲美女91| 亚洲激情综合| 亚洲激情视频在线播放| 1204国产成人精品视频| 精品电影一区| 在线高清一区| 亚洲国产一区二区三区高清| 在线看成人片| 亚洲国产导航| 亚洲日本欧美| 一区二区国产在线观看| 一本色道久久综合亚洲精品小说 | 欧美aa国产视频| 欧美成人午夜视频| 欧美大片va欧美在线播放| 欧美大香线蕉线伊人久久国产精品| 久久亚洲视频| 欧美二区在线| 欧美日韩精品在线视频| 欧美色欧美亚洲另类七区| 国产精品女主播| 国产精品日日摸夜夜摸av| 国产伦精品一区二区三| 国产亚洲成av人在线观看导航 | 欧美高清视频在线播放| 欧美三级乱人伦电影| 欧美激情久久久久久| 亚洲精品国产精品国自产观看浪潮 | 亚洲免费观看高清完整版在线观看|