A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王婷婷 中级黑马   /  2013-4-12 15:07  /  1258 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王婷婷 于 2013-4-14 15:09 编辑

keySet获取原理,听着有点晕

4 个回复

倒序浏览
本帖最后由 ①人←①城市 于 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> {
...
}


评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
看一个实例吧,有一个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 视图。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
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);       
                }
}
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报

如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马