LinkedHashSet 如何保证迭代顺序

asssf3214 2009-12-23 10:30:56
谁看过LinkedHashSet的源码,我怎么没看出来它跟HashSet的实现有任何不同
...全文
431 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
longtenggdf 2009-12-23
  • 打赏
  • 举报
回复
很奇怪是吧,答案其实是在他的父类 HashSet里面:
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}
通过LinkedHashMap 来实现排序的。至于为什么HashSet却没有排序的功能,那就要注意到这个构造方法是default的,只有ui包能访问到,外界是不能调用这个构筑器的,为什么这样设计还有待研究啊。
realreachard 2009-12-23
  • 打赏
  • 举报
回复
顺序固定!
ChDw 2009-12-23
  • 打赏
  • 举报
回复
你仔细看它调用的父类构造函数,实际上调用的是
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}

它的顺序由LinkedHashMap保证的(LinkedHashMap中的Entry有前一个和后一个的引用)
xlxyeyu 2009-12-23
  • 打赏
  • 举报
回复
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}

LinkedHashSet始终调用LinkedHashMap,也就是说它跟LinkedHashMap差不多,而Map有迭代循序
xlxyeyu 2009-12-23
  • 打赏
  • 举报
回复
咋回事呢?个人感觉Set不是不保证迭代顺序的嘛,LinkedHashSet本质上讲依旧是个Set
莫非就是一个true保证了迭代顺序???
asssf3214 2009-12-23
  • 打赏
  • 举报
回复
在实际使用中有很大的区别,HashSet迭代的顺序是不固定的,LinkedHashSet的迭代顺序是固定的
xlxyeyu 2009-12-23
  • 打赏
  • 举报
回复
又一次的封装吧,感觉没啥区别
asssf3214 2009-12-23
  • 打赏
  • 举报
回复
public class LinkedHashSet<E>
extends HashSet<E>
implements Set<E>, Cloneable, java.io.Serializable {

private static final long serialVersionUID = -2851667679971038690L;

public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);
}

public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);
}

public LinkedHashSet() {
super(16, .75f, true);
}

public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2*c.size(), 11), .75f, true);
addAll(c);
}
}

asssf3214 2009-12-23
  • 打赏
  • 举报
回复
昏,没仔细看,多谢了!

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧