62,614
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) throws IOException {
HashMap<Integer, String> hm = new HashMap<Integer, String>();
//添加测试数据
hm.put(1, "a");
hm.put(2, "b");
hm.put(3, "c");
//调用keySet()方法得到set集合
Set<Integer> key = hm.keySet(); //这里只是返回一个KeySet对象, 为什么就已经有值了?
System.out.println(key);
//==>[1, 2, 3] 这里输出了key值的集合, 说明调用keySet方法就已经得到了这个集合
}
public Set<K> keySet() {
Set<K> ks = keySet;
return (ks != null ? ks : (keySet = new KeySet())); //返回一个KeySet对象
}
private final class KeySet extends AbstractSet<K> {
public Iterator<K> iterator() {
return newKeyIterator();
}
public int size() {
return size;
}
public boolean contains(Object o) {
return containsKey(o);
}
public boolean remove(Object o) {
return HashMap.this.removeEntryForKey(o) != null;
}
public void clear() {
HashMap.this.clear();
}
}
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new KeySet();
keySet = ks;
}
return ks;
}
返回了一个 new KeySet(); 你直接打印 key 其实是打印 KeySet 的toString(),KeySet 的父类的父类, 的toString() 如下;
public String toString() {
Iterator<E> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
E e = it.next();
sb.append(e == this ? "(this Collection)" : e);
if (! it.hasNext())
return sb.append(']').toString();
sb.append(',').append(' ');
}
}
里面调用了iterator(); 方法。 仔细看 iterator() 是个抽象方法 所以, 向下找 AbstractCollection<E> 的 子类, 发现 keySet 重写了iterator();
public final Iterator<K> iterator() { return new KeyIterator(); }
它返回的是 new KeyIterator() ; 然后再看 new KeyIterator();
final class KeyIterator extends HashIterator
implements Iterator<K> {
public final K next() { return nextNode().key; }
}
然后 自己看吧!!!下班了