第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么使用空元素數(shù)組創(chuàng)建 ArrayList 而使用空表創(chuàng)建 HashSet?

為什么使用空元素數(shù)組創(chuàng)建 ArrayList 而使用空表創(chuàng)建 HashSet?

瀟湘沐 2022-07-27 21:01:13
也許有點哲學(xué)問題。查看 java 的ArrayList實現(xiàn),我注意到在創(chuàng)建新實例時,內(nèi)部“elementData”數(shù)組(保存項目)被創(chuàng)建為新的空數(shù)組:private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList() {    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}但是,使用表創(chuàng)建了一個HashSet(基于 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# 的 List 和 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;}那么,為什么兩種語言都為列表選擇空而為集合/映射選擇 null 是否有充分的理由?他們都對空數(shù)組技巧使用了“單個實例”,這很好,但為什么不只使用一個空數(shù)組呢?
查看完整描述

2 回答

?
喵喔喔

TA貢獻1735條經(jīng)驗 獲得超5個贊

從 C# 的角度回答。

對于空ArrayList的,如果您有一個空數(shù)組作為后備存儲,您會發(fā)現(xiàn)所有邏輯(獲取、添加、增長......)都“按原樣”工作。不需要額外的代碼來處理未初始化的情況,這使得整個實現(xiàn)更加整潔。而且由于空數(shù)組被緩存,這不會導(dǎo)致額外的堆分配,因此您無需額外成本即可獲得更簡潔的代碼。

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


查看完整回答
反對 回復(fù) 2022-07-27
?
慕的地6264312

TA貢獻1817條經(jīng)驗 獲得超6個贊

初始化elementData為一個空數(shù)組ArrayList可以避免null檢查grow(int minCapacity)方法,該方法調(diào)用:

elementData = Arrays.copyOf(elementData, newCapacity);

增加后備陣列的容量。當(dāng)?shù)谝淮握{(diào)用該方法時,該語句會將空數(shù)組“復(fù)制”到新數(shù)組的開頭(實際上它不會復(fù)制任何內(nèi)容)。

HashMap類似的策略中不會有用,因為當(dāng)您重新調(diào)整存儲桶數(shù)組的大小時,您不會將原始數(shù)組復(fù)制到新數(shù)組的開頭,您必須遍歷所有條目并找到新存儲桶每個條目的。因此,將 buckets 數(shù)組初始化為空數(shù)組而不是將其保持為 null 將需要您檢查數(shù)組的長度是否 == 0 而不是檢查它是否為 null。用另一種條件替換一個條件是沒有用的。


查看完整回答
反對 回復(fù) 2022-07-27
  • 2 回答
  • 0 關(guān)注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號