也许有点哲学问题。
查看 java 的ArrayList实现,我注意到在创建新实例时,内部“elementData”数组(保存项目)被创建为新的空数组:
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
但是,使用表创建了一个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 是否有充分的理由?
他们都对空数组技巧使用了“单个实例”,这很好,但为什么不只使用一个空数组呢?
喵喔喔
慕的地6264312
相关分类