LinkedHashSet是HashSet的子类
LinkedHashSet的底层是LinkedHashMap,而LinkedHashMap是HashMap的一个实现类。
底层维护是一个数组加双向链表。LinkedHashMap它是根据hashcode值来决定元素的存储位置,由于使用了双向链表,所以看起来像元素插入的顺序保存的。所以插入和取出的元素位置一致。
同样由于LinkedHashSet是继承Set集合,所以不允许添加重复的元素。
实际上LinkedHashSet和HashSet的实现原理类似,关键点就是双向链表。
LinkedHashMap中,是一个数组(table)加双向链表.第一次初始化为16个。HashMap以前放着是Node节点,现在LinkedHashMap中放着的是节点(数据)是LinkedHashMap$Entry.tables数组类型是LinkedHashMap$Node.
实际上他们的关系就是一种继承或者是实现。before, after就是链接双向链表的
下面代码的实现是内部内实现的,而且是静态内部内。
static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } }
after指向下一个元素,下一个元素的before指向上一个元素,形成双向链表。head和tail分别是头节点和尾节点
TreeSet 等学TreeMap在来