亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

HashMap的幾個要點

BWrong / 1366人閱讀

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

Java基礎(chǔ)系列

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的基本過程

當(dāng)我們調(diào)用get()方法,HashMap會使用鍵對象的hashcode找到bucket位置,然后獲取值對象。如果有兩個值對象儲存在同一個bucket,會調(diào)用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碰撞時的處理

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

rehash的時機及過程

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

參考

HashMap的工作原理

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/65571.html

相關(guān)文章

  • Java面試通關(guān)要點匯總集

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

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

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

    taowen 評論0 收藏0
  • Java相關(guān)

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

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

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

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

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

    Dean 評論0 收藏0

發(fā)表評論

0條評論

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