当前位置:编程学习 > JAVA >>

集合中的问题

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中被实例化的。

画了个关系图


希望能帮助到你! --------------------编程问答--------------------
引用 8 楼 u010926176 的回复:
我看了下源码,我想是这样的。
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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,