Java中键盘()方法的作用是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
,, public Set,键盘(),{ ,,,Set , ks =,键盘; ,,,if (ks ==, null), { ,,,,,ks =, new 键盘(); ,,,,,keySet =, ks; ,,,} ,,,return ks; 以前,,}> 从代码中了解到,第一次调用键盘方法时,键盘属性是null,然后进行了初始化,再将键盘属性返回。也就是说,HashMap里并不会随着把和移除的进行也维护一个键盘集合,而是在第一次调用键盘方法时,才给键盘属性初始化。
按照自己以往的理解,以为键盘返回的是一个集合,集合里面保存了HashMap的所有的关键。因为有了中先入为主的印象,所以读源码时,才感觉源码很奇怪。从源码中可以看的到,初始化时,只是创建了一个键盘类的对象,并没有把HashMap的关键都加入进来,方法就返回了。除了自己以往的理解外,还有一个现象,让我坚信这时HashMap的关键已经加入到键盘了,那就是在调试代码过程中IDE给出的调试信息。如下图,从图中可以看的出,创建完成键盘()后,调试信息就已经可以显示出,ks中有2个元素了。这个信息更加坚定了自己之前的理解。
那么,HashMap的关键是什么时候加入到键盘集合中的呢?顺着这个思路,我进行了一步一步的分析。自己看了键盘类的构造函数,发现只有默认构造函数。那么我想,如果没有在键盘构造函数里把HashMap的关键加入进的来,那么就有可能是在键盘的父类的构造函数中加入进来的。然后,自己找遍了键盘类的父类的构造函数,发现都是空实现,并没有任何加入HashMap的关键的操作。这到底是怎么回事呢?
其实HashMap的关键并没有加入到键盘集合中,而是在遍历的时候,使用迭代器对关键进行的遍历。这是结论。下面我们看一下原因和过程。
首先看一下键盘类的代码,如下图。可以看到,键盘类中的迭代器函数,返回的是一个KeyIterator类的对象。它的下方法返回的是HashIterator的nextNode的关键。也就是说,当使用迭代器遍历集合内的元素时,键盘类的迭代器,会保证能够依次获取到HashMap的节点的关键值,这就是我们遍历键集的过程的实质。
,, final class KeySet extends AbstractSet, { ,,,public final int 大小(),,,,,,,,,{,return 规模;,} ,,,public final void 明确(),,,,,,,,{,HashMap.this.clear ();,} ,,,public final Iterator , iterator (),,, {, return new  KeyIterator ();,} ,,,public final boolean 包含(Object o), {, return containsKey (o);,} ,,,public final boolean 删除(Object 键),{ ,,,,,return removeNode(散列(关键),钥匙,,空,,假的,,真的),!=,空; ,,,} ,,,public final Spliterator , spliterator (), { ,,,,,return new KeySpliterator<祝辞(HashMap.this, 0, 1, 0, 0); ,,,} ,,,public final void forEach (Consumer<?, super K>,动作),{ ,,,,,Node [],标签; ,,,,,if (action ==, null) ,,,,,,,throw new NullPointerException (); ,,,,,if (0, size 的在,,,,,(=tab 表),!=,null), { ,,,,,,,int mc =, modCount; ,,,,,,,for (int 小姐:=,0;,小姐:& lt;, tab.length;, + + i), { ,,,,,,,,,for (Node , e =,标签[我];,e !=,零;,e =, e.next) ,,,,,,,,,,,action.accept (e.key); ,,,,,,,} ,,,,,,,if (modCount !=, mc) ,,,,,,,,,throw new ConcurrentModificationException (); ,,,,,} ,,,} ,,} final 才能class KeyIterator  extends HashIterator ,,,implements Iterator , { ,,,public final K next (), {, return nextNode ()。key;,} ,,} abstract 才能class HashIterator  { ,,,Node ,下一个,,,,,//,next entry 用回报 ,,,Node ,现在,,,,//current 条目 ,,,int expectedModCount;,//for fast-fail ,,,int 指数;,,,,,,,//current 槽 ,,,HashIterator (), { ,,,,,expectedModCount =, modCount; ,,,,,Node [], t =,表; ,,,,,current =, next =,空; null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null null Java中键盘()方法的作用是什么