问题描述
Collectionhs=newHashSet();hs.add(..........);Iteratori=hs.iterator();while(i.hasNext()){..........}问题出来了,接口中的方法都是没实现的抽象方法,Iterator接口中的hashNext()方法究竟是被那个类重写了呢?找api找了半天也没找到.AllKnownImplementingClasses:BeanContextSupport.BCSIterator,EventReaderDelegate,Scanner在这些实现了iterator接口的类中,应该有和HashSet类存在继承关系的类吧,要不这hasNext()方法是从哪蹦出来的呢???
解决方案
解决方案二:
Seths=newHashSet();最好把类型加上
解决方案三:
例:Set<Person>set=newHashSet<Person>();
解决方案四:
建议你去看下jdk中HashSet源码,privatetransientHashMap<E,Object>map;publicHashSet(){map=newHashMap<E,Object>();}/***Returnsaniteratorovertheelementsinthisset.Theelements*arereturnedinnoparticularorder.**@returnanIteratorovertheelementsinthisset.*@seeConcurrentModificationException*/publicIterator<E>iterator(){returnmap.keySet().iterator();}
他里面有个私有域HashMap。调用HashMap的keySet方法,返回一个KeySet对象,再调用它的iterator方法的。
解决方案五:
直接看HashSet源代码应该能找到
解决方案六:
Collectionhs=newHashSet();hs.add(..........);Iteratori=hs.iterator();while(i.hasNext()){..........}
注意第三句,你的HashSet的iterator方法就已经返回实现了Iterator接口的一个对象引用。主要是从iterator方法里重写了hasNext()方法.具体在这个方法里是怎么重写的看3楼。不过要更清楚的话应该查看下keySet().iterator()方法的源码了。。
解决方案七:
HashSet里面重写了。和toArray()是差不多的。
解决方案八:
Iterator是所有集合类的基类他的hasNext()不需要重写2、他们不一定只继承而且有的时候还要实现,接口类都是一个iterator方法用来返回实现了Iterator接口对象,就可以调用hasNext()了
解决方案九:
Set<Person>set=newHashSet<Person>();
解决方案十:
顶楼上的,楼主记得要用泛型
解决方案十一:
除了API,还有jdk源码,更能解决问题;学习中。
解决方案十二:
如果我没记错的话,Java集合框架里迭代器都是用的内部迭代器。即在要被迭代的集合类里写一个private内部类,实现Iterator接口。而该集合实现Iteratable接口,这个接口有个方法是publicIteratoriterator(),方法new一个内部迭代器对象并返回。内部迭代器和集合类并没有继承关系。内部类有一定的闭包特性,它可以访问到外部类的私有域。
解决方案十三:
若用eclipse查看源代码后选中接口按ctrl+j自己看吧还有可以选中方法用ctrl+alt+h查看该方法被什么调用了
解决方案十四:
你自己动手做一个抽象工厂就知道了
解决方案十五:
引用3楼yidao620c的回复:
建议你去看下jdk中HashSet源码,JavacodeprivatetransientHashMap<E,Object>map;publicHashSet(){map=newHashMap<E,Object>();}/***Returnsaniteratorovertheelementsinthisset.Theelements*arereturnedinnoparticularorder.**@returnanIteratorovertheelementsinthisset.*@seeConcurrentModificationException*/…
没错,我也看了源码,受教了。但不明白的是为啥API中的HashSet里为啥没写iterator方法的相关内容。
解决方案:
HashIterator