也许有点哲学问题。
查看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;
}
那么,为什么两种语言都选择空作为列表,空为集合/映射,这有充分的理由吗?
他们都使用“单个实例”作为空数组技巧,这很好,但为什么不只用一个空数组呢?
白衣非少年
Qyouu
相关分类