成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

HashMap的幾個要點

BWrong / 1287人閱讀

摘要:基礎系列的與方法類初始化順序線程池如何彈性伸縮的幾個要點的緩存什么場景下使用阻塞隊列的使用及模式中的序本文主要記錄的幾個要點。的過程修改,也會判斷是否需要。

Java基礎系列

Java的hashcode與equals方法

Java類初始化順序

ThreadPoolExecutor線程池如何彈性伸縮

HashMap的幾個要點

Integer的緩存

什么場景下使用阻塞隊列

volatile的使用及DCL模式

try-catch-finally中的return

本文主要記錄hashmap的幾個要點。

幾個參數(shù)

初始容量
static final int DEFAULT_INITIAL_CAPACITY = 16; 初始容量:16

最大容量
static final int MAXIMUM_CAPACITY = 1 << 30; 最大容量:2的30次方:1073741824

默認負載因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;

擴容倍數(shù)
newCap = oldCap << 1; 擴容倍數(shù):*2倍

get的基本過程

當我們調用get()方法,HashMap會使用鍵對象的hashcode找到bucket位置,然后獲取值對象。如果有兩個值對象儲存在同一個bucket,會調用keys.equals()方法去找到鏈表中正確的節(jié)點,最終找到要找的值對象。

put的過程
/**
     * Implements Map.put and related methods
     *
     * @param hash hash for key
     * @param key the key
     * @param value the value to put
     * @param onlyIfAbsent if true, don"t change existing value
     * @param evict if false, the table is in creation mode.
     * @return previous value, or null if none
     */
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node[] tab; Node p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);
        else {
            Node e; K k;
            if (p.hash == hash &&
                ((k = p.key) == key || (key != null && key.equals(k))))
                e = p;
            else if (p instanceof TreeNode)
                e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;
                if (!onlyIfAbsent || oldValue == null)
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

修改modCount,也會判斷是否需要resize。

hash碰撞時的處理

當hash沖突時,以前都是用鏈表存儲,在java8里頭,當節(jié)點個數(shù)>=TREEIFY_THRESHOLD - 1時,HashMap將采用紅黑樹存儲,這樣最壞的情況下即所有的key都Hash沖突,采用鏈表的話查找時間為O(n),而采用紅黑樹為O(logn)。

rehash的時機及過程

默認的負載因子大小為0.75,也就是說,當一個map填滿了75%的bucket時候,和其它集合類(如ArrayList等)一樣,將會創(chuàng)建原來HashMap大小的兩倍的bucket數(shù)組,來重新調整map的大小,并將原來的對象放入新的bucket數(shù)組中。這個過程叫作rehashing,因為它調用hash方法找到新的bucket位置。

參考

HashMap的工作原理

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/65571.html

相關文章

  • Java面試通關要點匯總集

    摘要:本文會以引出問題為主,后面有時間的話,筆者陸續(xù)會抽些重要的知識點進行詳細的剖析與解答。敬請關注服務端思維微信公眾號,獲取最新文章。 原文地址:梁桂釗的博客博客地址:http://blog.720ui.com 這里,筆者結合自己過往的面試經(jīng)驗,整理了一些核心的知識清單,幫助讀者更好地回顧與復習 Java 服務端核心技術。本文會以引出問題為主,后面有時間的話,筆者陸續(xù)會抽些重要的知識點進...

    gougoujiang 評論0 收藏0
  • Java的hashcode與equals方法

    摘要:方法提供了對象的值,是一個方法,返回的默認值與一致。通常這個值是對象頭部的一部分二進制位組成的數(shù)字,具有一定的標識對象的意義存在,但絕不定于地址。與的關系相等兩個對象,則一定要相等。 Java基礎系列 Java的hashcode與equals方法 Java類初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap的幾個要點 Integer的緩存 什么場景下使...

    taowen 評論0 收藏0
  • Java相關

    摘要:本文是作者自己對中線程的狀態(tài)線程間協(xié)作相關使用的理解與總結,不對之處,望指出,共勉。當中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機制講得很透徹,深入淺出。 一小時搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個接口,程序可以通過...

    wangtdgoodluck 評論0 收藏0
  • volatile的使用及DCL模式

    摘要:基礎系列的與方法類初始化順序線程池如何彈性伸縮的幾個要點的緩存什么場景下使用阻塞隊列的使用及模式中的序本文主要介紹的相關知識。典型的使用場景,作為,采用來做信號通知不采用的容易出錯即模式,就是雙加鎖檢查模式。因而有了雙重檢測模式的應用。 Java基礎系列 Java的hashcode與equals方法 Java類初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 Has...

    developerworks 評論0 收藏0
  • 什么場景下使用阻塞隊列

    摘要:基礎系列的與方法類初始化順序線程池如何彈性伸縮的幾個要點的緩存什么場景下使用阻塞隊列的使用及模式中的序本文主要講什么場合適合使用阻塞隊列。相比之下,阻塞隊列只允許生產(chǎn)者的速度在一定速度上超過消費者的速度,但不會超過很多。 Java基礎系列 Java的hashcode與equals方法 Java類初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap的幾個要...

    Dean 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<