欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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,看一下如何运行的

大招

Java 集合类HashMap之keySet使用
Java 集合类HashMap之keySet使用
Java 集合类HashMap之keySet使用

结果

  • 这个时候结果就出来了,
  • 当map.keySet()的时候,确实值返回了一个空的对象
  • 但是当 for(Integer key :keys)开始循环的时候,发现会调用KeyIterator迭代器,并且调用KeyIterator的 next()函数,每循环一次就会调用一次
  • 结果就出来了,map.keySet()的时候并不会立即把所有的key返回过来,而是每次循环的自定寻找下一个key
  • 那么问题来了,在用idea的debug查看值的时候,为什么会看到所有的key?

Java 集合类HashMap之keySet使用

本文地址:https://blog.csdn.net/m0_37975854/article/details/108258736

相关标签: HashMap Java