黑马程序员技术交流社区

标题: Map集合中取对象的问题。 [打印本页]

作者: 陆鹏    时间: 2012-6-29 08:41
标题: Map集合中取对象的问题。
本帖最后由 陆鹏 于 2012-6-29 08:58 编辑

import java.util.*;
class Person
{
        int age;
        String name;
        Person(String name,int age)
        {
                this.age = age;
                this.name = name;
        }

        String getName()
        {
                return name;
        }

        int getAge()
        {
                return age;
        }




}


class  MapDemo2
{
        public static void main(String[] args)
        {
                HashMap<String,Integer> hm = new HashMap<String,Integer> ();
                hm.put("zhangsan",20);
                hm.put("lisi",21);
                hm.put("wangwu",19);
                hm.put("luliu",15);
                sop(hm);
                //接下来利用第一种方式获取Map中的对象。
                Set<String> ts = hm.keySet();               
                Iterator<String> it = ts.iterator();
               
                while(it.hasNext())
                {
                        String jian = it.next();
                        sop(hm.get(jian));
                }
        }
        
        static <Q> void sop(Q q)
        {
                System.out.println(q);
        }               
               
        
}
红色字体的部分中是可以编译运行的。
可是改为这样却不可以,搞不清楚为什么?
Set<String> ts = new Set<String>();
ts = hm.keySet();
这样编译不过,问题是Set是抽象的,无法实例化,API中写着Set是接口,可是上面红体字直接赋值却可以通过。
作者: 张立江    时间: 2012-6-29 08:45
接口无法实例化,但是可以被实现,
具体请参考http://bbs.itheima.com/forum.php?mod=viewthread&tid=17693
作者: 何旭栋    时间: 2012-6-29 08:46
本帖最后由 何旭栋 于 2012-6-29 08:52 编辑

Set是接口类型,不能实例化
不明白了,km.ketSet()返回的也是个Set类型,为什么就可以呢?
作者: 车风波    时间: 2012-6-29 08:52
红色代码实际上是hm.keySet();  返回了一个Set的实现类,然后用set接收,所以它可以使用set中的方法,像如add(),但你用new Set()就不行了,他是一个接口,接口里都没有方法体,如果你new 了但没法用其中的方法,所以不能new。
作者: 陆鹏    时间: 2012-6-29 08:54
本帖最后由 陆鹏 于 2012-6-29 08:56 编辑
小张童鞋 发表于 2012-6-29 08:45
接口无法实例化,但是可以被实现,
具体请参考http://bbs.itheima.com/forum.php?mod=viewthread&tid=17693 ...


意思是说hm.keySet();这个调用函数返回的对象已经将前面的Set实现了?
那如果是这样,那前面的引用变量类型 Set<String>有什么意义吗?或者说为什么要这样声明?
作者: 李天甲    时间: 2012-6-29 08:57
是的,返回的是一个set的具体实现...
作者: 陆鹏    时间: 2012-6-29 08:58
车风波 发表于 2012-6-29 08:52
红色代码实际上是hm.keySet();  返回了一个Set的实现类,然后用set接收,所以它可以使用set中的方法,像如a ...

懂了,这样搞的目的就是可以使用set中的方法了,也就是可以用迭代器了.
作者: 陆鹏    时间: 2012-6-29 08:58
解决很快,懂了。谢谢大家了。

作者: 许涛    时间: 2012-6-29 08:59
我说说原理吧

首先这里的Set集合是通过Map集合的keySet方法获取而来,之所以要在操作Map集合时,使用到Set
集合,是因为Map集合不能直接完成取出元素的操作,所以要借助Set集合中的迭代方法取获取Map集
合元素,进而执行更进一步的操作。Map集合中又有两个方法可以获取到Set集合,一个是楼主现在

说的keySet方法,另外一个方法是entrySet方法,前者取到是Map键,后者取的是键和值的关系。都
存储在Set集合中、


keySet方法和entrySet方法是Set和Map之间的桥梁,之所以要使用这两个方法就是要使Map和Set建
立关系,lz如果直接写Set<String> ts = new Set<String>();即使编译通过也是没有意义的
作者: 常佳杰    时间: 2012-6-29 09:05
如下代码...
package com.heima.changjiajie;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class Test18 {
                public static void main(String[] args)
                {
                        HashMap<String,Integer> hm = new HashMap<String,Integer> ();
                        hm.put("zhangsan",20);
                        hm.put("lisi",21);
                        hm.put("wangwu",19);
                        hm.put("luliu",15);
                        sop(hm);
                        //接下来利用第一种方式获取Map中的对象。
                        Set<String> ts = new TreeSet<String>();//或者Set<String> ts = new HashSetSet<String>();都行,set接口主要有两个实现类:HashSet和TreeSet..
                                                                
                                ts = hm.keySet();
                        Iterator<String> it = ts.iterator();
                        while(it.hasNext())
                        {
                                String jian = it.next();
                                sop(hm.get(jian));
                        }
                }
                static <Q> void sop(Q q)
                {
                        System.out.println(q);
                }               
        }
        class Person
        {
                int age;
                String name;
                Person(String name,int age)
                {
                        this.age = age;
                        this.name = name;
                }
                String getName()
                {
                        return name;
                }
                int getAge()
                {
                        return age;
                }
        }

作者: 张天天    时间: 2012-6-29 09:09
package luntantest;

import java.util.*;
class Person
{
        int age;
        String name;
        Person(String name,int age)
        {
                this.age = age;
                this.name = name;
        }

       String getName()
        {
                return name;
        }

       int getAge()
        {
                return age;
        }




}


class  MapDemo2
{
        public static void main(String[] args)
       {
                HashMap<String,Integer> hm = new HashMap<String,Integer> ();
                hm.put("zhangsan",20);
                hm.put("lisi",21);
                hm.put("wangwu",19);
                hm.put("luliu",15);
                sop(hm);
                //接下来利用第一种方式获取Map中的对象。
                Set<String> ts = hm.keySet();  
                System.out.println(ts.getClass().getName());
               Iterator<String> it = ts.iterator();
               
               while(it.hasNext())
                {
                        String jian = it.next();
                        sop(hm.get(jian));
                }
        }
        
       static <Q> void sop(Q q)
        {
                System.out.println(q);
        }               
               
      
}结果是
{wangwu=19, luliu=15, lisi=21, zhangsan=20}
java.util.HashMap$KeySet
19
15
21
20
我们可以看到这里的ts是一个实例,并且如果查看API的话,我们也会发现keyset就是Set的一个实例、。




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