不懂就问, LinkedHashSet 为什么要这样设计?

查看 52|回复 2
作者:codewld   
LinkedHashSet 源码可以精简如下:
public class LinkedHashSet extends HashSet {
       
    public LinkedHashSet() {
        super(16, .75f, true);
    }
   
}
其中,super 关键字调用的是父类中 "only used by LinkedHashSet" 的构造函数,如下:
public class HashSet {
       
    /**
     * Constructs a new, empty linked hash set.  (This package private
     * constructor is only used by LinkedHashSet.) The backing
     * HashMap instance is a LinkedHashMap with the specified initial
     * capacity and the specified load factor.
     */
    HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap(initialCapacity, loadFactor);
    }
   
}
在这样的设计下,HashSet 需要额外携带一部分不属于它的代码,实在不够优雅。

hashset, public, linkedhashset, specified

Origami404   
说不定就是因为懒得再写一次代码呢,每个映射只需要多付出一个指针的大小就可以立得一个 set ,多快乐啊
有些语言支持零大小类型,这种语言的 xxSet 可以直接是 xxMap ,毫无额外开销。我记得 Rust 标准库里的似乎就是这样实现的,但是我不确定了。
TtTtTtT   
HashSet 本身也没有多少逻辑,本质上就是用 HashMap 实现 Set 。
因此,基于继承的方案下,这里应该就是为了保护了 map 的 private ,然后开个 package private 的 constructor 给 LinkedHashSet 。
也有其他几种方案能达到这个效果,比如开个 package private 的 constructor 传一个 map factory 之类的,或者把 map 变成 package private 的。但是都挺奇怪的。
如果一定要说是根本问题是啥,就怪到 JVM 的单继承上,hhh
您需要登录后才可以回帖 登录 | 立即注册

返回顶部