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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么數(shù)組列表是使用空元素?cái)?shù)組創(chuàng)建的,而哈希集是使用空表創(chuàng)建的?

為什么數(shù)組列表是使用空元素?cái)?shù)組創(chuàng)建的,而哈希集是使用空表創(chuàng)建的?

也許有點(diǎn)哲學(xué)問(wèn)題。查看java的ArrayList實(shí)現(xiàn),我注意到在創(chuàng)建新實(shí)例時(shí),內(nèi)部“elementData”數(shù)組(保存項(xiàng)目)被創(chuàng)建為新的空數(shù)組:private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList() {    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}但是,使用表創(chuàng)建哈希集(基于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}這讓我開(kāi)始思考,所以我去查了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;}那么,為什么兩種語(yǔ)言都選擇空作為列表,空為集合/映射,這有充分的理由嗎?他們都使用“單個(gè)實(shí)例”作為空數(shù)組技巧,這很好,但為什么不只用一個(gè)空數(shù)組呢?
查看完整描述

2 回答

?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

從 C# 的角度回答。

對(duì)于空的 ,您會(huì)發(fā)現(xiàn),如果您有一個(gè)空數(shù)組作為后備存儲(chǔ),則所有邏輯(get,add,grow,...)都“按原樣”工作。無(wú)需額外的代碼來(lái)處理未初始化的情況,這使得整個(gè)實(shí)現(xiàn)更加整潔。由于空數(shù)組是緩存的,這不會(huì)導(dǎo)致額外的堆分配,因此您可以獲得更干凈的代碼,而無(wú)需額外費(fèi)用。ArrayList

因?yàn)檫@是不可能的,因?yàn)樵L問(wèn)存儲(chǔ)桶是通過(guò)公式完成的。嘗試計(jì)算被視為除以 0,因此無(wú)效。這意味著您需要專門處理“未初始化”的情況,因此使用空數(shù)組預(yù)先分配字段不會(huì)獲得任何好處。HashSethashCode % m_buckets.Length% 0


查看完整回答
反對(duì) 回復(fù) 2022-08-03
?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊

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

elementData = Arrays.copyOf(elementData, newCapacity);

以增加后備陣列的容量。首次調(diào)用該方法時(shí),該語(yǔ)句會(huì)將空數(shù)組“復(fù)制”到新數(shù)組的開(kāi)頭(實(shí)際上它不會(huì)復(fù)制任何內(nèi)容)。

在類似的策略中,沒(méi)有用,因?yàn)楫?dāng)您重新調(diào)整存儲(chǔ)桶數(shù)組的大小時(shí),您不會(huì)將原始數(shù)組復(fù)制到新數(shù)組的開(kāi)頭,您必須遍歷所有條目并找到每個(gè)條目的新存儲(chǔ)桶。因此,將 bucket 數(shù)組初始化為空數(shù)組而不是將其保留為 null 將要求您檢查數(shù)組的長(zhǎng)度是否 == 0,而不是檢查它是否為 null。用另一個(gè)條件替換一個(gè)條件是沒(méi)有用的。HashMap


查看完整回答
反對(duì) 回復(fù) 2022-08-03
  • 2 回答
  • 0 關(guān)注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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