日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

几个需要扩容的集合

發布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 几个需要扩容的集合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • ArrayList?
private void grow(int minCapacity) {int oldCapacity = elementData.length;// 新容量為舊容量的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);// 如果新容量發現比需要的容量還小,則以需要的容量為準if (newCapacity - minCapacity < 0)newCapacity = minCapacity;// 如果新容量已經超過最大容量了,則使用最大容量if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// 以新容量拷貝出來一個新數組elementData = Arrays.copyOf(elementData, newCapacity); }
  • HashMap
final Node<K, V>[] resize() {// 舊數組Node<K, V>[] oldTab = table;// 舊容量int oldCap = (oldTab == null) ? 0 : oldTab.length;// 舊擴容門檻int oldThr = threshold;int newCap, newThr = 0;if (oldCap > 0) {if (oldCap >= MAXIMUM_CAPACITY) {// 如果舊容量達到了最大容量,則不再進行擴容threshold = Integer.MAX_VALUE;return oldTab;} else if ((newCap = oldCap << 1) < MAXIMUM_CAPACITY &&oldCap >= DEFAULT_INITIAL_CAPACITY)// 如果舊容量的兩倍小于最大容量并且舊容量大于默認初始容量(16),則容量擴大為兩部,擴容門檻也擴大為兩倍newThr = oldThr << 1; // double threshold} else if (oldThr > 0) // initial capacity was placed in threshold// 使用非默認構造方法創建的map,第一次插入元素會走到這里// 如果舊容量為0且舊擴容門檻大于0,則把新容量賦值為舊門檻newCap = oldThr;else { // zero initial threshold signifies using defaults// 調用默認構造方法創建的map,第一次插入元素會走到這里// 如果舊容量舊擴容門檻都是0,說明還未初始化過,則初始化容量為默認容量,擴容門檻為默認容量*默認裝載因子newCap = DEFAULT_INITIAL_CAPACITY;newThr = (int) (DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);}if (newThr == 0) {// 如果新擴容門檻為0,則計算為容量*裝載因子,但不能超過最大容量float ft = (float) newCap * loadFactor;newThr = (newCap < MAXIMUM_CAPACITY && ft < (float) MAXIMUM_CAPACITY ?(int) ft : Integer.MAX_VALUE);}// 賦值擴容門檻為新門檻threshold = newThr;// 新建一個新容量的數組@SuppressWarnings({"rawtypes", "unchecked"})Node<K, V>[] newTab = (Node<K, V>[]) new Node[newCap];// 把桶賦值為新數組table = newTab;// 如果舊數組不為空,則搬移元素if (oldTab != null) {// 遍歷舊數組for (int j = 0; j < oldCap; ++j) {Node<K, V> e;// 如果桶中第一個元素不為空,賦值給eif ((e = oldTab[j]) != null) {// 清空舊桶,便于GC回收 oldTab[j] = null;// 如果這個桶中只有一個元素,則計算它在新桶中的位置并把它搬移到新桶中// 因為每次都擴容兩倍,所以這里的第一個元素搬移到新桶的時候新桶肯定還沒有元素if (e.next == null)newTab[e.hash & (newCap - 1)] = e;else if (e instanceof TreeNode)// 如果第一個元素是樹節點,則把這顆樹打散成兩顆樹插入到新桶中去((TreeNode<K, V>) e).split(this, newTab, j, oldCap);else { // preserve order// 如果這個鏈表不止一個元素且不是一顆樹// 則分化成兩個鏈表插入到新的桶中去// 比如,假如原來容量為4,3、7、11、15這四個元素都在三號桶中// 現在擴容到8,則3和11還是在三號桶,7和15要搬移到七號桶中去// 也就是分化成了兩個鏈表Node<K, V> loHead = null, loTail = null;Node<K, V> hiHead = null, hiTail = null;Node<K, V> next;do {next = e.next;// (e.hash & oldCap) == 0的元素放在低位鏈表中// 比如,3 & 4 == 0if ((e.hash & oldCap) == 0) {if (loTail == null)loHead = e;elseloTail.next = e;loTail = e;} else {// (e.hash & oldCap) != 0的元素放在高位鏈表中// 比如,7 & 4 != 0if (hiTail == null)hiHead = e;elsehiTail.next = e;hiTail = e;}} while ((e = next) != null);// 遍歷完成分化成兩個鏈表了// 低位鏈表在新桶中的位置與舊桶一樣(即3和11還在三號桶中)if (loTail != null) {loTail.next = null;newTab[j] = loHead;}// 高位鏈表在新桶中的位置正好是原來的位置加上舊容量(即7和15搬移到七號桶了)if (hiTail != null) {hiTail.next = null;newTab[j + oldCap] = hiHead;}}}}}return newTab; }
  • PriorityQueue?
private void grow(int minCapacity) {// 舊容量int oldCapacity = queue.length;// Double size if small; else grow by 50%// 舊容量小于64時,容量翻倍// 舊容量大于等于64,容量只增加舊容量的一半int newCapacity = oldCapacity + ((oldCapacity < 64) ?(oldCapacity + 2) :(oldCapacity >> 1));// overflow-conscious code// 檢查是否溢出if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// 創建出一個新容量大小的新數組并把舊數組元素拷貝過去queue = Arrays.copyOf(queue, newCapacity); }private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE; }

總結

以上是生活随笔為你收集整理的几个需要扩容的集合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。