黑马程序员技术交流社区

标题: 请教:keySet获取原理 [打印本页]

作者: 王婷婷    时间: 2013-4-12 15:07
标题: 请教:keySet获取原理
本帖最后由 王婷婷 于 2013-4-14 15:09 编辑

keySet获取原理,听着有点晕
作者: ①人←①城市    时间: 2013-4-12 15:17
本帖最后由 ①人←①城市 于 2013-4-12 15:45 编辑

map中的keySet方法吗?
如果是的话,则是返回此映射中包含的键的 Set 视图。
返回map中的key键作为新的集合,然后可以根据这个key结合再去取map里面的value

在Map接口源码中这样定义的: Set<K> keySet();

比如在子类: TreeMap中的keySet()方法源码如下:

...
private transient KeySet<K> navigableKeySet = null;
...
public Set<K> keySet() {
        return navigableKeySet();
    }

/**
     * @since 1.6
     */
    public NavigableSet<K> navigableKeySet() {
        KeySet<K> nks = navigableKeySet;
        return (nks != null) ? nks : (navigableKeySet = new KeySet(this));
    }

而这个java.util.NavigableSet

public interface NavigableSet<E> extends SortedSet<E> {
...
}



作者: love_java    时间: 2013-4-12 15:43
看一个实例吧,有一个Map对象,这时候使用keySet()方法获取所有的key值,比如:
   Map map = new HashMap();
   map.put(1, "a");
   map.put(2, "b");
   map.put(3, "c");
   map.put(4, "d");
   Set keys1 = map.keySet();
   Set keys2 = map.keySet();
   Set keys3 = map.keySet();
上面三个set对象key1,key2,key3引用的是一个对象。这是map的keySet()方法只返回一个set实例,所以当从key1中删除一个对象时候,key2和key3将会受到影响。
   keys1.remove(1);
   System.out.println(keys1);
   System.out.println(keys2);
   System.out.println(keys3);
打印结果为:
[2, 4, 3]
[2, 4, 3]
[2, 4, 3]


下面是摘自API帮助文档的说明

keySet
public Set keySet()返回此映射中所包含的键的 set 视图。该集合受映射的支持,所以映射的变化也反映在该集合中,反之亦然。该集合支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作,从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。

指定者:
接口 Map 中的 keySet
覆盖:
类 AbstractMap 中的 keySet
返回:
此映射所包含的键的 set 视图。

作者: 想学跑的猪    时间: 2013-4-12 19:08
keySet()是map中的一个方法,用于获取map集合里的所有对象所对应的的key'值,
map集合是一个双列集合,而Collection是单列集合,所谓的双列集合,集合列表
中有两个类型的值,key和value。而这两个类型的值是有关系的,在map接口中定
义了一个内部类专门对这两个值的关系进行了描述,我们只要知道两个类型的值是
有关系的,key值是不可重复的,所以我们可以根据集合中的key以及key与value的
关系找到value。
这是一个实例:

class Student{
        private String name;
        private int age;
        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public int getAge() {
                return age;
        }

        public void setAge(int age) {
                this.age = age;
        }
        Student(String name,int age){
                this.name=name;
                this.age=age;
        }       
}
public class Test3 {
        public static void main(String[] args){
                Student stu1=new Student("zhangsan",23);
                Student stu2=new Student("lisi",21);
                Student stu3=new Student("wangwu",19);
                Map<Student,String> map=new HashMap();
                map.put(stu1,"jiuye");
                map.put(stu2,"jiuye");
                map.put(stu3, "yure");
                Set<Student> keys=map.keySet();
               
                for(Object obj:keys){    //或者用迭代器去遍历也可以
                        map.get(obj);       
                }
}
}
作者: 打工人    时间: 2013-4-12 23:13

如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2