当前位置: 移动技术网 > IT编程>开发语言>Java > Java 集合类HashMap之keySet使用

Java 集合类HashMap之keySet使用

2020年08月01日  | 移动技术网IT编程  | 我要评论
HashMap之keySet前提作用代码keySet函数分析KeySet类分析KeyIterator类分析大招结果前提了解迭代器作用获取map的所有的key代码keySet函数public Set<K> keySet() { Set<K> 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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网