亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么數組列表是使用空元素數組創建的,而哈希集是使用空表創建的?

為什么數組列表是使用空元素數組創建的,而哈希集是使用空表創建的?

料青山看我應如是 2022-08-03 12:55:22
也許有點哲學問題。查看java的ArrayList實現,我注意到在創建新實例時,內部“elementData”數組(保存項目)被創建為新的空數組:private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList() {    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}但是,使用表創建哈希集(基于HashMap)的哈希集,而entreySet僅保留為空;transient Node<K,V>[] table;transient Set<Map.Entry<K,V>> entrySet;public HashMap() {    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted}這讓我開始思考,所以我去查了C#的列表和HashSet:https://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,61f6a8d9f0c40f6e https://referencesource.microsoft.com/#System.Core/System/Collections/Generic/HashSet.cs,2d265edc718b158b列表:static readonly T[]  _emptyArray = new T[0]; public List() {        _items = _emptyArray;}哈希集:private int[] m_buckets;public HashSet()        : this(EqualityComparer<T>.Default) { }public HashSet(IEqualityComparer<T> comparer) {    if (comparer == null) {        comparer = EqualityComparer<T>.Default;    }    this.m_comparer = comparer;    m_lastIndex = 0;    m_count = 0;    m_freeList = -1;    m_version = 0;}那么,為什么兩種語言都選擇空作為列表,空為集合/映射,這有充分的理由嗎?他們都使用“單個實例”作為空數組技巧,這很好,但為什么不只用一個空數組呢?
查看完整描述

2 回答

?
白衣非少年

TA貢獻1155條經驗 獲得超0個贊

從 C# 的角度回答。

對于空的 ,您會發現,如果您有一個空數組作為后備存儲,則所有邏輯(get,add,grow,...)都“按原樣”工作。無需額外的代碼來處理未初始化的情況,這使得整個實現更加整潔。由于空數組是緩存的,這不會導致額外的堆分配,因此您可以獲得更干凈的代碼,而無需額外費用。ArrayList

因為這是不可能的,因為訪問存儲桶是通過公式完成的。嘗試計算被視為除以 0,因此無效。這意味著您需要專門處理“未初始化”的情況,因此使用空數組預先分配字段不會獲得任何好處。HashSethashCode % m_buckets.Length% 0


查看完整回答
反對 回復 2022-08-03
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

初始化為 中的空數組可以避免在方法中簽入,該方法調用:elementDataArrayListnullgrow(int minCapacity)

elementData = Arrays.copyOf(elementData, newCapacity);

以增加后備陣列的容量。首次調用該方法時,該語句會將空數組“復制”到新數組的開頭(實際上它不會復制任何內容)。

在類似的策略中,沒有用,因為當您重新調整存儲桶數組的大小時,您不會將原始數組復制到新數組的開頭,您必須遍歷所有條目并找到每個條目的新存儲桶。因此,將 bucket 數組初始化為空數組而不是將其保留為 null 將要求您檢查數組的長度是否 == 0,而不是檢查它是否為 null。用另一個條件替換一個條件是沒有用的。HashMap


查看完整回答
反對 回復 2022-08-03
  • 2 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號