<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冰塊+java

    2011年10月18日

    java為數(shù)據(jù)結(jié)構(gòu)中的映射定義了一個接口java.util.Map;它有四個實(shí)現(xiàn)類,分別是HashMap Hashtable LinkedHashMap 和TreeMap
    Map主要用于存儲健值對,根據(jù)鍵得到值,因此不允許鍵重復(fù)(重復(fù)了覆蓋了),但允許值重復(fù)。
    ----------------------------------------------------------------
    HashMap 是一個最常用的Map,它根據(jù)鍵的HashCode 值存儲數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數(shù)據(jù)的順序是完全隨機(jī)的。HashMap最多只允許一條記錄的鍵為Null;允許多條記錄的值為 Null;
    HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導(dǎo)致數(shù)據(jù)的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
    -----------------------------------------------------------------
    Hashtable與 HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值為空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導(dǎo)致了 Hashtable在寫入時會比較慢。
    -----------------------------------------------------------------
    LinkedHashMap保存了記錄的插入順序,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的.也可以在構(gòu)造時用帶參數(shù),按照應(yīng)用次數(shù)排序。在遍歷的時候會比HashMap慢,不過有種情況例外,當(dāng)HashMap容量很大,實(shí)際數(shù)據(jù)較少時,遍歷起來可能會比LinkedHashMap慢,因?yàn)長inkedHashMap的遍歷速度只和實(shí)際數(shù)據(jù)有關(guān),和容量無關(guān),而HashMap的遍歷速度和他的容量有關(guān)。
    -----------------------------------------------------------------
    TreeMap實(shí)現(xiàn)SortMap接口,能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用Iterator 遍歷TreeMap時,得到的記錄是排過序的。
    ------------------------------------------------------------------------------------------
    總結(jié):
    一般情況下,我們用的最多的是HashMap,HashMap里面存入的鍵值對在取出的時候是隨機(jī)的,它根據(jù)鍵的HashCode值存儲數(shù)據(jù),根據(jù)鍵可以直接獲取它的值,具有很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。
    TreeMap取出來的是排序后的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那么TreeMap會更好。
    LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那么用LinkedHashMap可以實(shí)現(xiàn),它還可以按讀取順序來排列,像連接池中可以應(yīng)用。
    posted @ 2011-10-21 09:58 iceblock 閱讀(977) | 評論 (0)編輯 收藏
    同步性
    Vector是同步的。這個類中的一些方法保證了Vector中的對象是線程安全的。而ArrayList則是異步的,因此ArrayList中的對象并不是線程安全的。因?yàn)橥降囊髸绊憟?zhí)行的效率,所以如果你不需要線程安全的集合那么使用ArrayList是一個很好的選擇,這樣可以避免由于同步帶來的不必要的性能開銷。
    ---------------------------------------------------------------------------------------------------------------------
    數(shù)據(jù)增長
    從內(nèi)部實(shí)現(xiàn)機(jī)制來講ArrayList和Vector都是使用數(shù)組(Array)來控制集合中的對象。當(dāng)你向這兩種類型中增加元素的時候,如果元素的數(shù)目超出了內(nèi)部數(shù)組目前的長度它們都需要擴(kuò)展內(nèi)部數(shù)組的長度,Vector缺省情況下自動增長原來一倍的數(shù)組長度,ArrayList是原來的50%,所以最后你獲得的這個集合所占的空間總是比你實(shí)際需要的要大。所以如果你要在集合中保存大量的數(shù)據(jù)那么使用Vector有一些優(yōu)勢,因?yàn)槟憧梢酝ㄟ^設(shè)置集合的初始化大小來避免不必要的資源開銷。
    --------------------------------------------------------------------------------------------------------------------
    使用模式
    在ArrayList和Vector中,從一個指定的位置(通過索引)查找數(shù)據(jù)或是在集合的末尾增加、移除一個元素所花費(fèi)的時間是一樣的,這個時間我們用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花費(fèi)的時間會呈線形增長:O(n-i),其中n代表集合中元素的個數(shù),i代表元素增加或移除元素的索引位置。為什么會這樣呢?以為在進(jìn)行上述操作的時候集合中第i和第i個元素之后的所有元素都要執(zhí)行位移的操作。這一切意味著什么呢?
    這意味著,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好選擇其他的集合操作類。比如,LinkList集合類在增加或移除集合中任何位置的元素所花費(fèi)的時間都是一樣的?O(1),但它在索引一個元素的使用缺比較慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因?yàn)槟憧梢院唵蔚氖褂盟饕齺泶鎰?chuàng)建iterator對象的操作。LinkList也會為每個插入的元素創(chuàng)建對象,所有你要明白它也會帶來額外的開銷。
    -------------------------------------------------------------------------------------------------------------
    最后,在《Practical Java》一書中Peter Haggar建議使用一個簡單的數(shù)組(Array)來代替Vector或ArrayList。尤其是對于執(zhí)行效率要求高的程序更應(yīng)如此。因?yàn)槭褂脭?shù)組(Array)避免了同步、額外的方法調(diào)用和不必要的重新分配空間的操作。
    posted @ 2011-10-18 14:39 iceblock 閱讀(168) | 評論 (0)編輯 收藏
    String 是不可變的對象, 因此在每次對 String 類型進(jìn)行改變的時候其實(shí)都等同于生成了一個新的 String 對象,然后將指針指向新的String 對象,所以經(jīng)常改變內(nèi)容的字符串最好不要用 String。因?yàn)槊看紊蓪ο蠖紩ο到y(tǒng)性能產(chǎn)生影響,特別當(dāng)內(nèi)存中無引用對象多了以后, JVM 的 GC 就會開始工作,那速度是一定會相當(dāng)慢的。
    -------------------------------------------------------------------------------------
    StringBuffer 每次結(jié)果都會對 StringBuffer 對象本身進(jìn)行操作,而不是生成新的對象,再改變對象引用。線程安全
    -----------------------------------------------------------------------------------------
    StringBuilder 用在字符串緩沖區(qū)被單個線程使用的時候    線程不安全

    ------------------------------------------------------------------------------------------

    1.如果要操作少量的數(shù)據(jù)用 = String

    2.單線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuilder

    3.多線程操作字符串緩沖區(qū) 下操作大量數(shù)據(jù) = StringBuffer

    posted @ 2011-10-18 13:05 iceblock 閱讀(166) | 評論 (0)編輯 收藏

    導(dǎo)航

    <2011年10月>
    2526272829301
    2345678
    9101112131415
    16171819202122
    23242526272829
    303112345

    統(tǒng)計(jì)

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 香蕉视频在线免费看| 国产精品亚洲小说专区| 一级有奶水毛片免费看| 国产乱人免费视频| 精品无码专区亚洲| 又黄又大又爽免费视频| 久久亚洲精品高潮综合色a片| 在线免费观看a级片| 亚洲AV成人无码网天堂| 国产免费啪嗒啪嗒视频看看| 美女被暴羞羞免费视频| 亚洲成A人片77777国产| 好猛好深好爽好硬免费视频| 久久久久亚洲AV无码专区首| 18禁止看的免费污网站| 亚洲依依成人精品| 国产三级电影免费观看| 农村寡妇一级毛片免费看视频| 亚洲无码视频在线| 久久国产精品免费视频| 亚洲一级毛片在线观| 97人伦色伦成人免费视频| 午夜亚洲WWW湿好爽| 国产成人亚洲影院在线观看| 免费久久人人爽人人爽av| 亚洲黄色在线视频| 日韩人妻无码免费视频一区二区三区 | 精品熟女少妇AV免费观看| 中文有码亚洲制服av片| 国产精品免费_区二区三区观看 | 97久久精品亚洲中文字幕无码 | 色视频色露露永久免费观看| 黄色免费在线网址| 亚洲欧洲自拍拍偷午夜色无码| 全部免费毛片在线播放| 亚洲综合激情五月丁香六月| 又粗又硬免费毛片| 日本免费一区二区三区四区五六区 | 看成年女人免费午夜视频| 亚洲色成人WWW永久网站| 1000部拍拍拍18勿入免费凤凰福利 |