集合中的问题
package cn.mldn.demo;import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(3, "张三");
map.put(3, "李四"); // key重复,value会被新内容覆盖
map.put(1, "王五");
map.put(0, "赵六");
Set<Map.Entry<Integer, String>> set = map.entrySet();
Iterator<Map.Entry<Integer, String>> iter = set.iterator();
while (iter.hasNext()) {
Map.Entry<Integer, String> me = iter.next();
System.out.println(me.getKey() + "," + me.getValue());
}
}
}
map.entrySet()返回的是Set接口的实例化,接口中的方法都是抽象方法,为什么可以直接调用呢:set.iterator() --------------------编程问答-------------------- 这个Set早在某个地方被实现,它拥有的是Set的类型的引用而已,实际对象可能是TreeSet啊,HashSet,这里不必关心了 --------------------编程问答-------------------- 严格地说,它不是一个 "Set对象",因为 Set 是抽象的,不可能直接派生对象,所以它一定是 "实现了 Set 接口的某个类的对象",这样去理解就合理了。 --------------------编程问答-------------------- 由于前面你实例的是HashMap,在HashMap源码中,对entrySet方法有具体实现。
public Set entrySet()
{
return entrySet0();
}
private Set entrySet0()
{
Set set = entrySet;
return set == null ? (entrySet = new EntrySet()) : set;
}
private final class EntrySet extends AbstractSet --------------------编程问答-------------------- HashMap的entrySet方法的返回值是set接口的一个实现,这个实现类叫做EntrySet,所以就可以直接调用其相应的方法,set只是一个接口,没有实现的 --------------------编程问答-------------------- 如果某个类是接口,那么调用接口里抽象方法的实际实例就是它的实现类,这就是多态,父类的引用指向子类对象 --------------------编程问答-------------------- 抽象方法由子类提供实现,没有说不能访问啊 --------------------编程问答-------------------- 多态 --------------------编程问答-------------------- 我看了下源码,我想是这样的。
Set<Map.Entry<Integer, String>> set = map.entrySet();
对应jdk源码:
public Set<Map.Entry<K,V>> entrySet() {
return entrySet0();
}
private Set<Map.Entry<K,V>> entrySet0() {
Set<Map.Entry<K,V>> es = entrySet;
return es != null ? es : (entrySet = new EntrySet());
}
entrySet0()方法返回的是一个EntrySet()
源码:
private final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
public Iterator<Map.Entry<K,V>> iterator() {
return newEntryIterator();
}
public boolean contains(Object o) {
if (!(o instanceof Map.Entry))
return false;
Map.Entry<K,V> e = (Map.Entry<K,V>) o;
Entry<K,V> candidate = getEntry(e.getKey());
return candidate != null && candidate.equals(e);
}
public boolean remove(Object o) {
return removeMapping(o) != null;
}
public int size() {
return size;
}
public void clear() {
HashMap.this.clear();
}
}
EntrySet继承AbstractSet,AbstractSet实现了Set接口
代码如下:
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E>
所以Set是在EntrySet中被实例化的。
画了个关系图
希望能帮助到你! --------------------编程问答--------------------
写的很详细了,学习一下 --------------------编程问答-------------------- top top top
补充:Java , Java SE