成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

對String的深刻理解

瀏覽:177日期:2024-07-18 17:19:05
內容: 近期到CSDN論壇看看一些網友貼的面試題,其中關于String的問題常常被提及。我一直以為自己很清楚這個東西了,其實深究起來,發現自己并不那么清楚,會犯一些錯誤;同時也產生了一些聯想。小結一下。1、'abc'與new String('abc'); 經常會問到的面試題:String s = new String('abc');創建了幾個String Object?【如這里創建了多少對象? 和一道小小的面試題 】 這個問題比較簡單,涉及的知識點包括:引用變量與對象的區別; 字符串文字'abc'是一個String對象; 文字池[pool of literal strings]和堆[heap]中的字符串對象。 一、引用變量與對象:除了一些早期的Java書籍和現在的垃圾書籍,人們都可以從中比較清楚地學習到兩者的區別。A aa;語句聲明一個類A的引用變量aa[我常常稱之為句柄],而對象一般通過new創建。所以題目中s僅僅是一個引用變量,它不是對象。[ref 句柄、引用與對象] 二、Java中所有的字符串文字[字符串常量]都是一個String的對象。有人[特別是C程序員]在一些場合喜歡把字符串'當作/看成'字符數組,這也沒有辦法,因為字符串與字符數組存在一些內在的聯系。事實上,它與字符數組是兩種完全不同的對象。 System.out.println('Hello'.length()); char[] cc={'H','i'}; System.out.println(cc.length); 三、字符串對象的創建:由于字符串對象的大量使用[它是一個對象,一般而言對象總是在heap分配內存],Java中為了節省內存空間和運行時間[如比較字符串時,==比equals()快],在編譯階段就把所有的字符串文字放到一個文字池[pool of literal strings]中,而運行時文字池成為常量池的一部分。文字池的好處,就是該池中所有相同的字符串常量被合并,只占用一個空間。我們知道,對兩個引用變量,使用==判斷它們的值[引用]是否相等,即指向同一個對象:String s1 = 'abc' ;String s2 = 'abc' ;if( s1 == s2 ) System.out.println('s1,s2 refer to the same object');else System.out.println('trouble'); 這里的輸出顯示,兩個字符串文字保存為一個對象。就是說,上面的代碼只在pool中創建了一個String對象。 現在看String s = new String('abc');語句,這里'abc'本身就是pool中的一個對象,而在運行時執行new String()時,將pool中的對象復制一份放到heap中,并且把heap中的這個對象的引用交給s持有。ok,這條語句就創建了2個String對象。String s1 = new String('abc') ;String s2 = new String('abc') ;if( s1 == s2 ){ //不會執行的語句} 這時用==判斷就可知,雖然兩個對象的'內容'相同[equals()判斷],但兩個引用變量所持有的引用不同, BTW:上面的代碼創建了幾個String Object? [三個,pool中一個,heap中2個。] [Java2 認證考試學習指南 (第4版)( 英文版)p197-199有圖解。]2、字符串的+運算和字符串轉換 字符串轉換和串接是很基礎的內容,因此我以為這個問題簡直就是送分題。事實上,我自己就答錯了。String str = new String('jf'); // jf是接分str = 1+2+str+3+4; 一共創建了多少String的對象?[我開始的答案:5個。jf、new、3jf、3jf3、3jf34] 首先看JLS的有關論述: 一、字符串轉換的環境[JLS 5.4 String Conversion] 字符串轉換環境僅僅指使用雙元的+運算符的情況,其中一個操作數是一個String對象。在這一特定情形下,另一操作數轉換成String,表達式的結果是這兩個String的串接。 二、串接運算符[JLS 15.18.1 String Concatenation Operator + ] 如果一個操作數/表達式是String類型,則另一個操作數在運行時轉換成一個String對象,并兩者串接。此時,任何類型都可以轉換成String。[這里,我漏掉了'3'和'4']如果是基本數據類型,則如同首先轉換成其包裝類對象,如int x視為轉換成Integer(x)。 現在就全部統一到引用類型向String的轉換了。這種轉換如同[as if]調用該對象的無參數toString方法。[如果是null則轉換成'null']。因為toString方法在Object中定義,故所有的類都有該方法,而且Boolean, Character, Integer, Long, Float, Double, and String改寫了該方法。 關于+是串接還是加法,由操作數決定。1+2+str+3+4 就很容易知道是'3jf34'。[BTW :在JLS的15.18.1.3中舉的一個jocular little example,真的很無趣。] 下面的例子測試了改寫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'; }}三、字符串轉換的優化按照上述說法,str = 1+2+str+3+4;語句似乎應該就應該生成5個String對象:1+2 =3,then 3→Integer(3)→'3' in pool? [假設如此] '3'+str(in heap) = '3jf' (in heap) '3jf' +3 ,first 3→Integer(3)→'3' in pool? [則不創建] then '3jf3' '3jf3'+4 create '4' in pool then '3jf34' 這里我并不清楚3、4轉換成字符串后是否在池中,所以上述結果仍然是猜測。 為了減少創建中間過渡性的字符串對象,提高反復進行串接運算時的性能,a Java compiler可以使用StringBuffer或者類似的技術,或者把轉換與串接合并成一步。例如:對于 a + b + c ,Java編譯器就可以將它視為[as if] new StringBuffer().append(a).append(b).append(c).toString(); 注意,對于基本類型和引用類型,在append(a)過程中仍然要先將參數轉換,從這個觀點看,str = 1+2+str+3+4;創建的字符串可能是'3'、'4'和'3jf34'[以及一個StringBuffer對象]。 現在我仍然不知道怎么回答str = 1+2+str+3+4;創建了多少String的對象,。或許,這個問題不需要過于研究,至少SCJP不會考它。3、這又不同:str = '3'+'jf'+'3'+'4'; 如果是一個完全由字符串文字組成的表達式,則在編譯時,已經被優化而不會在運行時創建中間字符串。測試代碼如下: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指向同一個對象,這個對象在pool中。所有遵循Java Language Spec的編譯器都必須在編譯時對constant expressions 進行簡化。JLS規定:Strings computed by constant expressions (ý15.28) are computed at compile time and then treated as if they were literals. 對于String str2 ='3'+'jf'+'3'+'4';我們說僅僅創建一個對象。注意,“創建多少對象的討論是說運行時創建多少對象。 BTW:編譯時優化 String x = 'aaa ' + 'bbb '; if (false) { x = x + 'ccc '; } x += 'ddd '; 等價于: String x = 'aaa bbb '; x = x + 'ddd ';4、不變類 String對象是不可改變的(immutable)。有人對str = 1+2+str+3+4;語句提出疑問,怎么str的內容可以改變?其實仍然是因為不清楚:引用變量與對象的區別。str僅僅是引用變量,它的值——它持有的引用可以改變。你不停地創建新對象,我就不斷地改變指向。[參考TIJ的Read-only classes。] 不變類的關鍵是,對于對象的所有操作都不可能改變原來的對象[只要需要,就返回一個改變了的新對象]。這就保證了對象不可改變。為什么要將一個類設計成不變類?有一個OOD設計的原則:Law of Demeter。其廣義解讀是: 使用不變類。只要有可能,類應當設計為不變類。 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd 近期到CSDN論壇看看一些網友貼的面試題,其中關于String的問題常常被提及。我一直以為自己很清楚這個東西了,其實深究起來,發現自己并不?
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美无砖砖区免费| 亚洲欧洲在线观看av| 玖玖在线精品| 久久久精品影视| 韩国欧美国产1区| 久久不见久久见免费视频1| 欧美成ee人免费视频| 亚洲资源av| 国产午夜精品一区二区| 亚洲成精国产精品女| 五月天亚洲婷婷| 91国在线观看| 高清不卡一区二区| 免费观看一级特黄欧美大片| 国产一区二区视频在线播放| 99精品视频免费| 中文字幕精品一区| 欧美日韩一区二区三区在线视频 | 图片区小说区国产精品视频| 亚洲视频观看| 91精品国产一区二区三区蜜臀| 国产精品综合一区二区三区| 一本久久综合亚洲鲁鲁五月天 | 麻豆91在线看| 另类国产ts人妖高潮视频| 欧美乱妇15p| 蜜桃一区二区三区在线观看| 欧美一级久久| 日韩一区欧美二区| 羞羞视频在线观看欧美| 亚洲裸体在线观看| 激情偷拍久久| 亚洲欧洲日韩在线| 欧美全黄视频| 国产精品区一区二区三区| 女人天堂亚洲aⅴ在线观看| 欧美日韩国产美| 免费人成网站在线观看欧美高清| 亚洲每日在线| 亚洲欧美日韩一区二区三区在线观看| 欧美精品午夜| 中文字幕制服丝袜成人av| 女人色偷偷aa久久天堂| 久久美女艺术照精彩视频福利播放 | 亚洲一区国产视频| 亚洲福利精品| 亚洲天堂免费看| 亚洲国产激情| 中文字幕av一区二区三区免费看| 日韩激情一区二区| 久久一区二区三区四区五区| 日韩欧美一二三区| 不卡电影免费在线播放一区| 日韩欧美一区二区久久婷婷| 国产999精品久久| 日韩欧美电影一二三| 韩国欧美国产1区| 欧美日韩精品欧美日韩精品| 国产一区亚洲一区| 91精品国产一区二区| 国产一区二区三区在线观看免费| 五月激情丁香一区二区三区| 久久综合一区二区三区| 亚洲自拍偷拍综合| 亚洲一区激情| 日韩国产精品大片| 欧美性大战久久久久久久| 国产精品自在在线| 2020国产精品久久精品美国| 97精品视频在线观看自产线路二| 国产农村妇女精品| 欧美视频日韩| 国产女主播一区| 牛牛国产精品| 一级日本不卡的影视| 色香蕉久久蜜桃| 国产一区二区主播在线| 日韩欧美一区二区久久婷婷| 欧美福利精品| 洋洋成人永久网站入口| 欧美在线观看视频在线| 国产精品久久久久天堂| 国产精品毛片在线| 开心九九激情九九欧美日韩精美视频电影 | 欧美xxxxxxxxx| 91麻豆产精品久久久久久 | 一级中文字幕一区二区| 色婷婷综合久久久久中文一区二区 | 国产成人鲁色资源国产91色综| 精品99久久久久久| 国内精品99| 亚洲福利电影网| 久久久水蜜桃| 精品一区二区三区在线播放视频| 精品日产卡一卡二卡麻豆| 韩国一区二区三区美女美女秀| 亚洲精品国产无套在线观| 国产精品乱码| 国产中文字幕精品| 国产区在线观看成人精品| 99国产精品久久久久久久成人热| 日韩在线播放一区二区| 91精品国产91热久久久做人人 | 婷婷成人激情在线网| 欧美精品123区| 欧美高清日韩| 三级久久三级久久久| 日韩欧美国产综合一区| 亚洲福利视频导航| 精品福利av导航| 欧美性欧美巨大黑白大战| 黄色日韩在线| 成人免费高清在线观看| 亚洲成人免费在线| 国产视频一区二区在线| 欧美日韩精品一区二区三区蜜桃| 亚洲激情视频| 91丝袜高跟美女视频| 激情国产一区二区| 亚洲国产精品一区二区www在线| 2017欧美狠狠色| 欧美中文字幕一区二区三区| 亚洲激情女人| 91麻豆精品秘密| 国产精品18久久久久久久久| 亚洲高清在线视频| 中文字幕在线观看不卡| 亚洲精品在线免费观看视频| 精品视频在线免费看| 亚洲综合欧美| 极品中文字幕一区| 91在线丨porny丨国产| 国产福利精品一区| 久久99日本精品| 丝袜美腿亚洲色图| 一个色综合网站| 亚洲欧洲在线观看av| 久久久久久久一区| 精品久久久三级丝袜| 91精品国产综合久久小美女| 91豆麻精品91久久久久久| 亚洲色诱最新| 亚洲国产mv| 欧美一区在线看| 国产成人丝袜美腿| 国产自产2019最新不卡| 麻豆成人久久精品二区三区小说| 亚洲成人免费视频| 一区二区免费看| 亚洲丝袜精品丝袜在线| 国产精品久久午夜| 国产精品黄色在线观看| 欧美高清在线视频| 国产亚洲欧美在线| 久久―日本道色综合久久| 日韩欧美国产成人一区二区| 91精品国产乱码久久蜜臀| 欧美精品色综合| 欧洲av在线精品| 在线观看国产精品网站| 色av综合在线| 在线精品视频小说1| 色婷婷av久久久久久久| 色天使色偷偷av一区二区| 久久综合婷婷| 色综合久久九月婷婷色综合| 久久精品观看| 一本大道久久精品懂色aⅴ| 久久精品动漫| 色悠悠久久综合| 欧美午夜在线一二页| 欧美影院一区二区三区| 91国内精品野花午夜精品| 91福利区一区二区三区| 日本高清无吗v一区| 在线免费观看一区| 欧美丝袜丝nylons| 欧美日韩国产另类一区| 欧美日韩国产精品自在自线| 777午夜精品视频在线播放| 欧美一区二区在线免费观看| 日韩免费在线观看| 亚洲精品一线二线三线| 久久久精品国产免费观看同学| 2021久久国产精品不只是精品| 久久久久久久久岛国免费| 国产三级欧美三级日产三级99| 欧美激情在线一区二区| 国产精品视频一二三区| 中文字幕一区二区在线观看| 中文字幕中文字幕一区| 一区二区三区高清在线| 石原莉奈在线亚洲三区| 国产一区二区三区黄视频 | 国产日韩欧美不卡在线| 久久免费的精品国产v∧| 国产精品久久毛片av大全日韩| 亚洲精品国产视频| 天堂久久久久va久久久久| 精品无人码麻豆乱码1区2区|