多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > [Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的)

[Java 泥水匠] Java Components 之一:Java String (肯定有你不懂的)

來源:程序員人生   發布時間:2014-12-16 08:53:18 閱讀次數:2720次
作者:泥沙磚瓦漿木匠
網站:http://blog.csdn.net/jeffli1993
個人簽名:打算起手非凡寫出鴻篇巨作的人,常常堅持不了完成第1章節。

1.1 前言

        說起String,大家最熟習不過了。我也是那末說過,但是恍如這熟習的里面也有很多細節,或是我們沒掌握的東西。常常有很多舊東西里面爆出很多光點。比如,作者泥瓦匠近期在冬季的牛崽褲里面搜出了1張100現金(不宜樂乎)?;氐秸},我們下面以下幾點講下String。分兩個部份:
       基礎部份:(JDK源碼 文檔)

  • 1.2 你好 String
  • 1.3 String字符串操作

        擴大部份:

  • 1.3  == 與 equals 不是親家
  • 1.4 也不難 泥瓦匠再出奇招
  • 1.5 equals碰到n長字符串呢?
  • 1.6 intern妙用

        樓主不是大牛級別的人物,泥瓦匠1直認為的是“打算起手非凡寫出鴻篇巨作的人,常常堅持不了完成第1章節?!彼裕僦I盤,聽著喜歡的音樂。幽默的對你說我的理解體會。
(希望大牛指出毛病,萬分感謝!)

1.2 你好 String

        懷著初次見你的心情,泥瓦匠和你1起打開JDK1.7文檔。我最近想寫1些關于JDK1.7的理解,都知道JDK8出來了,新特性我準備下階段有空學習。
        泥瓦匠想說,瀏覽E文文檔有益于體會原汁原味。但畢竟國內大牛翻譯的很不錯了,我們不加評判,喜歡哪一種自己挑。能抓老鼠,能解決實際項目,適應業務環境的就是你學到了。請看下面的小例子:

清單1.1

String abc = "abc"; char data[] = {'a','b','c'}; String abcStr = new String(data); System.out.println("abc"); String cde = "cde"; System.out.println("abc" + cde); String c = "abc".substring(2,3); String d = cde.substring(1, 2); System.out.println(c); System.out.println(d);

        泥瓦匠,你不是在忽悠我嗎?這么簡單的程序,你想說甚么。說實在確切是基礎,但基礎扎實才能有更高的突破。就想泥瓦匠默默為自己,為家人為未來打基礎。

       可以見,String是不需要用new來創建1個新對象的類。它是不可變的(Constant),其值(像"abc"創建后,不可改變)。自然,String其實實現了基本類型char的序列的功能,因此中文名“字符串”。這里大家有可能疑惑,泥瓦匠就找到JDK源碼證據給你們看:

wpsDD6A.tmp

        這段代碼是來自JDK1.7源碼里面的,char型value數組的情勢組成了String類的內容。其操作就是針對value數組操作。這樣想是不是豁然開朗,然后心里自喜“so easy”。其實難點下面,大家漸漸看下去。

 

1.3 String字符串操作

        照舊看代碼清單1.1,Java提供了1個特殊的連接操作符(concatenation operator)+ 用于直接來拼接字符串。其中操作經常使用的方法羅列以下:

方法 作用 s.length() 返回s字符串長度 s.charAt(1) 返回s字符串中下標為1的字符 s.substring(0, 2) 返回s字符串中下標0到2的子字符串 s.indexOf("nsg") 返回子字符串"nsg"的下標 s.startsWith(" ") 判斷s是不是以空格開始 s.endsWith("end") 判斷s是不是以"end"結束

隨著泥瓦匠運行下清單1.1,你可以看到打印出來:

abc abccde c d

        很簡單的發現答案就是我們心目中想要的。這里我不打算很詳細的解釋api,這樣會失去文章的趣味和讀者的興趣。我喜歡用例子來引導出,對String在我項目和經驗中的總結。
下面就以我們substring()方法來解釋下源碼,可以看到其中實現的細節:
wpsDD7A.tmp
邏輯大致歸納以下:
        1. 首先判斷傳入值得可靠性,判斷傳入的開始和結束,還有子字符串的長度。這是在每一個系統開發需要在細節中關心的。關心細節,才能干大事。
        2. 然后判斷是否是原String,是的話,直接返回this,如果不是就new1個子串。這個構造函數實現也不難,如果有興趣可以看看,其實也就是實現char數組的拷貝。 

        就String基礎部份泥瓦匠就介紹這里,在這里我們可以得出的結論是:設計源于生活,源于簡單。像1個方法和1個類結構的設計,單1簡單。所以我們學習以后設計方法要簡單,耦合度不能太高。
到這里,讀者可以先聽首歌,比如甚么的鋼琴曲,甚么月光曲。休息會繼續講。

1.3  == 與 equals 不是親家

        有人看到這個會大吃1驚,然后質問說“老師說,String 和 == 沒關系,你是否是瞎扯淡”。哈哈,我只能說,只不過修行在實際。舉個小栗子吧。
看下面清單1.2

static String b = "ab"; private static void test(){ String a = "a" + "b"; System.out.println(a == b); }

看到這里,你是不是覺得這么簡單,心里想著肯定是“false,泥瓦匠真逗。”運行下,結果卻是

true

      結論: 關于 == ,我們要知道 == 用于匹配內存單元的內容。Java中對照的就是兩個內存單元的內容(其實就是1串數字)。至于8個基本類型直接比較值。例如清單1.2,比較的是兩個援用,兩個援用對照的是援用的對象的邏輯值(也就是兩個對象對應內存單元的內容)。


泥瓦匠的記憶宮殿:就是相當于 泥瓦匠和我的親姐姐比較我們兩個的爸爸,畢竟的爸爸都是那1個,固然是true。

"a" + "b"的生命是怎樣樣的呢?網絡牛人有些反編譯會發現實際上是類似下面的進程:

StringBuilder temp = new StringBuilder(); temp.append("a").append("b"); return temp.toString();

        究竟JVM是怎樣把"a" + "b"和"ab"知道他們是1樣的呢。我們回顧下,由于String是不可變類,也就是靜態Java語言的特點。這觸及到JVM的優化方案。但JVM很死板,它不會很人工智能的像人腦,它會的只是它能處理的,所以好好了解JVM有助于開發更好的額程序。比如定義1個ab字符串常量夠了,它不會在再 子串 a b。這就是它的優化方案。
        泥瓦匠的記憶宮殿:這就是偷懶思想,今天我要見我爸爸,明天姐姐要見爸爸。合并下唄,后天1起去見爸爸。
        就此我們可以得出結論:編譯器給我帶來它對程序的優化,為了提升程序的效力和內存資源等,所以我們可以明白,如何掌握其特性寫出更好的代碼。

 

1.4 也不難 泥瓦匠再出奇招

補充個例子,看看你們真的掌握沒?

private static String getA(){ return "a";} private static void test2(){ String a = "a"; String b = a + "b"; String e = getA() + "b"; System.out.println(b == "ab"); System.out.println(e == "ab"); }

這觸及了JVM的優化,答案是:
false false

如果猜到了,證明你真懂了。泥瓦匠還是耐心的講授下:
        第1個false:b是包括了1個常量和1個援用的值,所以。
        第2個false: 你也能夠猜到外部方法的常量在本方法只是1個援用。所以。
結論以下:我們現在如果不知道JVM怎樣在編譯時期優化,我們就漸漸了解它們。

 

1.5 equals碰到n長字符串呢?

        這個例子不好寫,泥瓦匠就帶你們看看源碼等。equals其實不陌生,相信大家的系統里面有很多設計到這個方法。

        其實equals是實現了Object的equals方法,而在Object的equals:
wpsDD7B.tmp
它其實就是實現了 == 比較內存的內容。
Q:泥瓦匠,為何String要重寫Object,這不致使意義不1致了嗎?
A:非也非也,String是String,String用來處理的事物邏輯和業務和Object完全不同。equals顧名思義等于,等于不表示完全相等。而是1樣或相似。正所謂業務看情況,比如泥瓦匠處理得金融數據1般小數點10幾位,那請問你還會在意小數點10位后的的值嗎,當它們比較的時候,你不會在意,所以這就是相似。

        那末我們就看1下String實現的equals方法:
wpsDDAB.tmp

        簡單描寫下,就是遍歷兩個數組最好的條件下,就是要末長度不同,要末前面幾個不同。直接返回false。
Q:如果碰到大字符串這就悲劇了。所以1些大字符串怎樣處理呢。
A:其實實際中,大字符串也難見。但說處理的話,大字符串匹配可以斟酌分割匹配或是啥的這里就不展開了。

Q:equals重寫 和 hashCode 有關系嗎?

A:這里我們要先說明hashCode方法提供對象的hashCode值,返回與默許的System.identityHashCode()1致。其廣泛用于集合框架。到后面我也會講到。hashCode的源于計算機的比較源于數字,而不是對象。所以1個hashCode值標識1個對象,產生了對象相干的很多算法。但是默許的hashCode犯法會發起對本地的調用開消很大。

好累好累,泥瓦匠喝口水,講完下面這個,我們String到此結束。

1.6 intern妙用

intern大家就有點陌生了。我們首先得普及下常量池的概念,常量池(constant pool)指的是在編譯期被肯定,并被保存在已編譯的.class文件中的1些數據。它包括了關于類、方法、接口等中的常量,也包括字符串常量。然后看看下面的例子:

private static void test5(){ String a = "a"; String b = a + "b"; String c = "ab"; String d = new String("ab"); System.out.println(c == d.intern()); System.out.println(b.intern() == d.intern()); }

當調用 intern()方法時,JVM 會在這個常量池中通過 equals()方法查找是不是存在等值的 String,如果存在,則直接返回常量池中這個 String 對象的地址;沒有找到,則會創建等值的字符串,返回其地址。
思考提升:這有甚么用呢?
答曰:可以用于1些常量的存儲比較,枚舉(枚舉底層就是字符串,哈哈)。當想常量比常量,多數的情況下,斟酌效力則選擇 intern()而不是equals。

總結

String是Java基礎組件重要的1部份。我漸漸的總結的J2EE Java的組件體系,然后增加內容進去。還是那句話,泥瓦匠想說:

如以上文章或鏈接對你有幫助的話,別忘了在文章按鈕或到頁面右下角點擊 “贊1個” 按鈕哦。你也能夠點擊頁面右側“分享”懸浮按鈕哦,讓更多的人瀏覽這篇文章

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日韩精品一区二三区中文 | 亚洲高清一区二区三区四区 | 亚洲毛片在线观看 | 亚洲黑人嫩小videos | 亚洲经典自拍 | 国产日产欧产精品精品推荐小说 | 国产福利一区二区 | 欧美一区二区三区gg高清影视 | 成人午夜在线视频 | 性久久久久久久久 | 国产精品一区二区国产 | 欧美另类成人 | 欧美成人性色生活18黑人 | h在线观看免费 | 国产免费福利视频一区二区 | 亚洲第二区 | fxxxx性欧美高清 | 噜噜噜噜私人影院av线观看 | 久久天天躁夜夜躁狠狠躁2020 | 国产一区2区 | 亚洲综合免费视频 | 亚洲欧美一区二区三区另类 | 日日麻批视频 | 国产二区视频在线观看 | 性―交―乱―色―情 | 另类综合图片 | 国产日产欧美一区二区三区 | 99久久精品国产一区二区成人 | 午夜影院免费入口 | 久久99国产综合精品 | 久久99毛片免费观看不卡 | 大香网伊人久久综合网2020 | 香蕉在线精品视频在线观看2 | 狠狠躁天天躁夜夜躁婷婷 | 欧美日韩亚洲区久久综合 | 亚洲国产欧美精品 | 最近最新中文字幕免费的一页 | 午夜色综合 | 日本欧美久久久久免费播放网 | 久久精品中文字幕不卡一二区 | 日韩 欧美 亚洲国产 |