Java之HashSet源码分析(第三篇:访问)
程序员文章站
2022-04-03 19:33:47
...
0、HashSet毕竟是作为集合实现的,集合里的包含、未包含这样的概念比较突出,所以HashSet没有提供直接获取一个元素的方法
1、包含元素判断
public boolean contains(Object o) {
return map.containsKey(o);
}
直接调用了HashMap的containsKey方法,传入的key对象即可
2、遍历元素(间接获得元素)
public Iterator<E> iterator() {
return map.keySet().iterator();
}
HashSet可以用两种遍历方法,foreach语句和调用迭代器,其实算一种,因为foreach底层也是迭代器
iterator方法返回一个Iterator对象,这里是直接用了HashMap的keySet()方法,keySet()方法会返回一个Set对象,该Set对象的实际类型是KeySet对象,接着就会再调用KeySet对象的iterator方法,该方法会返回一个KeyIterator对象
3、看下迭代器的返回过程(以下代码位于HashMap中)
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new KeySet();
keySet = ks;
}
return ks;
}
4、以下代码位于HashMap的内部类KeySet中
public final Iterator<K> iterator() { return new KeyIterator(); }
5、以下代码位于HashMap的内部类KeyIterator中
final class KeyIterator extends HashIterator
implements Iterator<K> {
public final K next() { return nextNode().key; }
}
6、有了迭代器对象,我们就可以愉快的进行遍历元素的操作