【JAVA】Map集合(映射集合)、键值对的概念&集合对象的取和放

Map集合
Map集合的作用就是为了快速查找,他里面的集合我们就可以理解为哈希表,且哈希表存东西最好使用键和值。这里要注意的是,Map集合和Collection集合是并列的关系,不存在继承关系。

注:哈希表就是稀疏数组,因为他虽然是数组,但并不是每个索引都用上了,即位置没有存满,浪费了许多空间。

键值对
Map存储时一般都需要两个东西,我们把哈希表里的每个东西叫做Entry对象,另外表外有一个Entry接口。这个接口里定义了两个方法——key(键)value(值)

为什么是分为键和值两部分呢?
因为,我们拿键的哈希码来计算我们所要存储的索引,查找也一样通过键来查找。键也是对象,每个对象都有一个HasCode。且HasCode主要是用来计算数组的索引的。而且用键值对查找,其查找速度非常快。

但是,这里要注意的是,有的时候,我们拿值去保存哈希码的话,可能不是太好。我们希望去找特定的数据类型,专门拿某种类型来计算哈希码。

将对象放进集合
集合先将键和值封装成Entry,然后根据键算出哈希码的索引,然后将计算好的Entry对象放到计算出来的那个索引的位置上。

Map m = new HashMap();
m.put("abc", new Student(2000, "孙悟空", 'm'));
m.put("bcd", new Student(2001, "牛魔王",'m'));
m.put("cde", new Student(1999, "紫霞仙子", 'f'));

将集合中的对象取出
通过键所封装的对象的索引位置,来取出Entry对象。但是,最终返回的是值,而不是Entry对象。

Map m = new HashMap();
m.put("abc", new Student(2000, "孙悟空", 'm'));
m.put("bcd", new Student(2001, "牛魔王",'m'));
m.put("cde", new Student(1999, "紫霞仙子", 'f'));

 System.out.println(m.get("abc"));

哈希码
这里的哈希码是从Object继承下来的,但是不见子类就合适,因为Object继承下来的哈希码是用地址算的,所以值特别大。如果要往哈希表里面放,那么浪费空间就比较大,所以子类一般会重写。

通过键取Entry对象
返回Entry对象的方法只有一个entrySet方法,而entrySet返回的一定是Set。即它将Entry封装成了Set集合,我们这里返回的是Entry接口的集合。

		System.out.println(m.get("abc"));
        Set s = m.entrySet();
        //迭代Set
        Iterator iter = s.iterator();
        //判断
        while (iter.hasNext()) {
         Map.Entry entry=(Map.Entry)iter.next();
         System.out.println(entry.getKey()+":"+entry.getValue());
        }

遍历所有的值

 //这里不能用Set,因为Set是个无序集,
            //且不能重复,但是,哈希表里的值可以重复。
            //所以,应该用Collection来引用,不敢用Set。
            //values返回的是Collection,
            //且不能返回Set,因为这样会将值给去掉,
            //且值有可能是重复的。
            //键也不能重复,键也返回的是Set。
            Collection c=m.values();
            Iterator it=c.iterator();
            while(it.hasNext()){
                System.out.println(it.next());
            }

拿到所有的键

/**
             * 拿到所有的键
             */
            Set ss=m.keySet();
            Iterator iter1=ss.iterator();
            while(iter1.hasNext()){
                System.out.println(iter1.next());
            }
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_临渔_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值