Java 集合类HashMap之keySet使用
程序员文章站
2022-06-28 17:08:41
HashMap之keySet前提作用代码keySet函数分析KeySet类分析KeyIterator类分析大招结果前提了解迭代器作用获取map的所有的key代码keySet函数public Set keySet() { Set ks; return (ks = keySet) == null ? (keySet = new KeySet()) : ks;}分析如果keySet是空的,那么就new一个,否则就返回keySet懵逼...
前提
了解迭代器
作用
- 获取map的所有的key
代码
keySet函数
public Set<K> keySet() { Set<K> ks; return (ks = keySet) == null ? (keySet = new KeySet()) : ks; }
分析
- 如果keySet是空的,那么就new一个,否则就返回keySet
- 懵逼了,new一个,那也是空的啊,返回一个没有值的对象是什么意思?我要的是所有的key啊!
- 那我们就看看KeySet对象
KeySet类
final class KeySet extends AbstractSet<K> { //获取大小 public final int size() { return size; } //清空 public final void clear() { HashMap.this.clear(); } //迭代器 public final Iterator<K> iterator() { return new KeyIterator(); } //是否包含指定key public final boolean contains(Object o) { return containsKey(o); } //移除 public final boolean remove(Object key) { return removeNode(hash(key), key, null, false, true) != null; } //我也不知道这个单词啥意思,百度翻译说的是分流器 public final Spliterator<K> spliterator() { return new KeySpliterator<>(HashMap.this, 0, -1, 0, 0); } //jdk8的for public final void forEach(Consumer<? super K> action) { Node<K,V>[] tab; if (action == null) throw new NullPointerException(); if (size > 0 && (tab = table) != null) { int mc = modCount; for (int i = 0; i < tab.length; ++i) { for (Node<K,V> e = tab[i]; e != null; e = e.next) action.accept(e.key); } if (modCount != mc) throw new ConcurrentModificationException(); } } }
分析
- 这里面也没有说遍历对象,获取所有的key啊!
- Iterator这个方法可能有用,我们看看这个代码
KeyIterator类
final class KeyIterator extends HashIterator implements Iterator<K> { public final K next() { return nextNode().key; } }
分析
- 这里也就只有一个next方法,还是懵逼,是在不行,只能debug,看一下如何运行的
大招
结果
- 这个时候结果就出来了,
- 当map.keySet()的时候,确实值返回了一个空的对象
- 但是当 for(Integer key :keys)开始循环的时候,发现会调用KeyIterator迭代器,并且调用KeyIterator的 next()函数,每循环一次就会调用一次
- 结果就出来了,map.keySet()的时候并不会立即把所有的key返回过来,而是每次循环的自定寻找下一个key
- 那么问题来了,在用idea的debug查看值的时候,为什么会看到所有的key?
本文地址:https://blog.csdn.net/m0_37975854/article/details/108258736
推荐阅读