作者:泥沙磚瓦漿木匠 網站:http://blog.csdn.net/jeffli1993 個人簽名:打算起手非凡寫出鴻篇巨作的人,常常堅持不了完成第1章節。 |
說起String,大家最熟習不過了。我也是那末說過,但是恍如這熟習的里面也有很多細節,或是我們沒掌握的東西。常常有很多舊東西里面爆出很多光點。比如,作者泥瓦匠近期在冬季的牛崽褲里面搜出了1張100現金(不宜樂乎)?;氐秸},我們下面以下幾點講下String。分兩個部份:
基礎部份:(JDK源碼 文檔)
擴大部份:
樓主不是大牛級別的人物,泥瓦匠1直認為的是“打算起手非凡寫出鴻篇巨作的人,常常堅持不了完成第1章節?!彼裕僦I盤,聽著喜歡的音樂。幽默的對你說我的理解體會。
(希望大牛指出毛病,萬分感謝!)
懷著初次見你的心情,泥瓦匠和你1起打開JDK1.7文檔。我最近想寫1些關于JDK1.7的理解,都知道JDK8出來了,新特性我準備下階段有空學習。
泥瓦匠想說,瀏覽E文文檔有益于體會原汁原味。但畢竟國內大牛翻譯的很不錯了,我們不加評判,喜歡哪一種自己挑。能抓老鼠,能解決實際項目,適應業務環境的就是你學到了。請看下面的小例子:
清單1.1
泥瓦匠,你不是在忽悠我嗎?這么簡單的程序,你想說甚么。說實在確切是基礎,但基礎扎實才能有更高的突破。就想泥瓦匠默默為自己,為家人為未來打基礎。
可以見,String是不需要用new來創建1個新對象的類。它是不可變的(Constant),其值(像"abc"創建后,不可改變)。自然,String其實實現了基本類型char的序列的功能,因此中文名“字符串”。這里大家有可能疑惑,泥瓦匠就找到JDK源碼證據給你們看:
這段代碼是來自JDK1.7源碼里面的,char型value數組的情勢組成了String類的內容。其操作就是針對value數組操作。這樣想是不是豁然開朗,然后心里自喜“so easy”。其實難點下面,大家漸漸看下去。
照舊看代碼清單1.1,Java提供了1個特殊的連接操作符(concatenation operator)+ 用于直接來拼接字符串。其中操作經常使用的方法羅列以下:
隨著泥瓦匠運行下清單1.1,你可以看到打印出來:
有人看到這個會大吃1驚,然后質問說“老師說,String 和 == 沒關系,你是否是瞎扯淡”。哈哈,我只能說,只不過修行在實際。舉個小栗子吧。
看下面清單1.2
看到這里,你是不是覺得這么簡單,心里想著肯定是“false,泥瓦匠真逗。”運行下,結果卻是
泥瓦匠的記憶宮殿:就是相當于 泥瓦匠和我的親姐姐比較我們兩個的爸爸,畢竟的爸爸都是那1個,固然是true。
"a" + "b"的生命是怎樣樣的呢?網絡牛人有些反編譯會發現實際上是類似下面的進程:
究竟JVM是怎樣把"a" + "b"和"ab"知道他們是1樣的呢。我們回顧下,由于String是不可變類,也就是靜態Java語言的特點。這觸及到JVM的優化方案。但JVM很死板,它不會很人工智能的像人腦,它會的只是它能處理的,所以好好了解JVM有助于開發更好的額程序。比如定義1個ab字符串常量夠了,它不會在再 子串 a b。這就是它的優化方案。
泥瓦匠的記憶宮殿:這就是偷懶思想,今天我要見我爸爸,明天姐姐要見爸爸。合并下唄,后天1起去見爸爸。
就此我們可以得出結論:編譯器給我帶來它對程序的優化,為了提升程序的效力和內存資源等,所以我們可以明白,如何掌握其特性寫出更好的代碼。
補充個例子,看看你們真的掌握沒?
如果猜到了,證明你真懂了。泥瓦匠還是耐心的講授下:
第1個false:b是包括了1個常量和1個援用的值,所以。
第2個false: 你也能夠猜到外部方法的常量在本方法只是1個援用。所以。
結論以下:我們現在如果不知道JVM怎樣在編譯時期優化,我們就漸漸了解它們。
這個例子不好寫,泥瓦匠就帶你們看看源碼等。equals其實不陌生,相信大家的系統里面有很多設計到這個方法。
其實equals是實現了Object的equals方法,而在Object的equals:
它其實就是實現了 == 比較內存的內容。
Q:泥瓦匠,為何String要重寫Object,這不致使意義不1致了嗎?
A:非也非也,String是String,String用來處理的事物邏輯和業務和Object完全不同。equals顧名思義等于,等于不表示完全相等。而是1樣或相似。正所謂業務看情況,比如泥瓦匠處理得金融數據1般小數點10幾位,那請問你還會在意小數點10位后的的值嗎,當它們比較的時候,你不會在意,所以這就是相似。
那末我們就看1下String實現的equals方法:
簡單描寫下,就是遍歷兩個數組最好的條件下,就是要末長度不同,要末前面幾個不同。直接返回false。
Q:如果碰到大字符串這就悲劇了。所以1些大字符串怎樣處理呢。
A:其實實際中,大字符串也難見。但說處理的話,大字符串匹配可以斟酌分割匹配或是啥的這里就不展開了。
Q:equals重寫 和 hashCode 有關系嗎?
A:這里我們要先說明hashCode方法提供對象的hashCode值,返回與默許的System.identityHashCode()1致。其廣泛用于集合框架。到后面我也會講到。hashCode的源于計算機的比較源于數字,而不是對象。所以1個hashCode值標識1個對象,產生了對象相干的很多算法。但是默許的hashCode犯法會發起對本地的調用開消很大。
intern大家就有點陌生了。我們首先得普及下常量池的概念,常量池(constant pool)指的是在編譯期被肯定,并被保存在已編譯的.class文件中的1些數據。它包括了關于類、方法、接口等中的常量,也包括字符串常量。然后看看下面的例子:
當調用 intern()方法時,JVM 會在這個常量池中通過 equals()方法查找是不是存在等值的 String,如果存在,則直接返回常量池中這個 String 對象的地址;沒有找到,則會創建等值的字符串,返回其地址。
思考提升:這有甚么用呢?
答曰:可以用于1些常量的存儲比較,枚舉(枚舉底層就是字符串,哈哈)。當想常量比常量,多數的情況下,斟酌效力則選擇 intern()而不是equals。
String是Java基礎組件重要的1部份。我漸漸的總結的J2EE Java的組件體系,然后增加內容進去。還是那句話,泥瓦匠想說:
如以上文章或鏈接對你有幫助的話,別忘了在文章按鈕或到頁面右下角點擊 “贊1個” 按鈕哦。你也能夠點擊頁面右側“分享”懸浮按鈕哦,讓更多的人瀏覽這篇文章