【194天】黑马程序员27天视频学习笔记【Day18-上】

本文深入讲解Java中Map集合的基本概念、特点及其实现类HashMap、TreeMap等,并介绍Map集合的存储、删除、判断和获取功能,同时提供四种遍历方法的示例代码。

叨逼叨两句

  1. 要用做投资的思路去做每一件事情,你的资本就是注意力、时间、金钱
  2. 始终关注风险收益率
  3. 价值:注意力 > 时间 > 金钱

18-1:Map集合概述和与Collection接口的区别

概述

  1. 键值对
  2. 一个映射不能包含重复的键
  3. 每个键最多只能映射到一个值
  4. HashSet的底层是使用HashMap实现的。

区别

  1. Map是双列的,Collection是单列的
  2. Map的键唯一,Collection的子体系Set是唯一的

    1. Map的实现类:HashMap与TreeMap,其中HashMap还有个子类是LinkedHashMap
    2. Collection的体系见下图

      ![](http://a1.qpic.cn/psb?/V13aP5rZ2U5DOS/nJ9aokKm92agCAqU*RZ.cQExhzVc6RO2cxbYLHYrMV0!/b/dD4BAAAAAAAA&bo=IQX5AQAAAAADAPk!&rf=viewer_4)
  3. Map集合的数据结构仅针对键有效,跟值无关;Collection集合的数据结构是针对元素有效。

18-2:Map集合的功能概述

  1. 存储功能:put

    HashMap<String,Integer> map = new HashMap<String,Integer>();
            Integer i1 = map.put("张3", 23);
            Integer i2 = map.put("张4", 24);
            Integer i3 = map.put("张5", 25);
            Integer i4 = map.put("张6", 26);
            Integer i5 = map.put("张3", 27);        //相同的键不存储,对应的值将覆盖,返回的值是被覆盖的值
            
            System.out.println(map);
            
            System.out.println(i1);
            System.out.println(i2);
            System.out.println(i3);
            System.out.println(i4);
            System.out.println(i5);
  2. 删除功能

    1. clear
    2. remove
    package com.test.demo555;
    
    import java.util.HashMap;
    
    public class Demo044 {
        public static void main(String[] args){
            HashMap<String,Integer> map = new HashMap<String,Integer>();
            map.put("z3", 23);
            map.put("z4", 24);
            map.put("z5", 25);
            map.put("z6", 26);
            
            Integer i = map.remove("z3");
            System.out.println(i);
            System.out.println(map);
            
        }
    }
  3. 判断功能

    1. containsKey
    2. containsValue
    3. isEmpty
    package com.test.demo555;
    
    import java.util.HashMap;
    
    public class Demo044 {
        public static void main(String[] args){
            HashMap<String,Integer> map = new HashMap<String,Integer>();
            map.put("z3", 23);
            map.put("z4", 24);
            map.put("z5", 25);
            map.put("z6", 26);
            boolean b1 = map.containsKey("z3");
            boolean b2 = map.containsValue(23);
            boolean b3 = map.isEmpty();
            System.out.println(b1);
            System.out.println(b2);
            System.out.println(b3);
            
        }
  4. 获取功能

    1. entrySet
    2. get
    3. keyset
    4. values

18-(3-4):Map集合遍历的四种方法

通过键找值的思路

  1. 获取所有键的集合
  2. 遍历键的集合,获取到每一个键
  3. 根据键找值

方法

  1. 使用迭代器
package com.test.demo555;

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

public class Demo001 {
    public static void main(String[] args) {
        HashMap<String,Integer> hm = new HashMap<>();
        hm.put("z3", 23);
        hm.put("z4", 24);
        hm.put("z5", 25);
        hm.put("z6", 26);
        
        Set<String> keySet = hm.keySet();
        Iterator<String> it = keySet.iterator();
        while(it.hasNext()){
            String key = it.next();
            Integer value = hm.get(key);
            System.out.println(key + "=" + value);
        }
        
    }
}
  1. 使用增强for循环
package com.test.demo555;

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

public class Demo001 {
    public static void main(String[] args) {
        HashMap<String,Integer> hm = new HashMap<>();
        hm.put("z3", 23);
        hm.put("z4", 24);
        hm.put("z5", 25);
        hm.put("z6", 26);
        
        for(String key:hm.keySet()){
            System.out.println(key + "=" + hm.get(key));
        }
        
    }
}

通过键值对对象找键和值的思路

  1. 获取所有键值对对象的集合
  2. 遍历键值对对象的集合,获取到每一个键值对对象

方法

  1. 使用迭代器
package com.test.demo555;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Demo001 {
    public static void main(String[] args) {
        HashMap<String,Integer> hm = new HashMap<>();
        hm.put("z3", 23);
        hm.put("z4", 24);
        hm.put("z5", 25);
        hm.put("z6", 26);
        
        //Map.Entry说明Entry是Map的内部接口,将键和值封装成了Entry对象,并存储在Set集合中 
        Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();
        Iterator<Entry<String,Integer>> it = entrySet.iterator();
        while(it.hasNext()){
            //Map.Entry<String,Integer> en = it.next();//父类引用指向子类对象
            Entry<String,Integer> en = it.next();//直接获取的是子类对象【Entry是Map.Entry的子类对象】
            String key = en.getKey();
            Integer value = en.getValue();
            System.out.println(key + "=" + value);
        }
        
    }
}
  1. 使用增强for循环
package com.test.demo555;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Demo001 {
    public static void main(String[] args) {
        HashMap<String,Integer> hm = new HashMap<>();
        hm.put("z3", 23);
        hm.put("z4", 24);
        hm.put("z5", 25);
        hm.put("z6", 26);
        
        for(Entry<String,Integer> en : hm.entrySet()){
            System.out.println(en.getKey() + "=" + en.getValue());
        }
        
    }
}

18-5:HashMap集合键是Student值是String的案例

想要去重,就必须重写Student类中的hashCode方法和equals方法

package com.test.demo001;

public class Student {
    private String name;
    private int age;
    
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = 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;
    }
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
    
    
    
    
}
package com.test.demo001;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Demo31 {
    public static void main(String[] args) {
        Map<Student,String> map = new HashMap<Student,String>();
        map.put(new Student("z3",23), "BeiJing");
        map.put(new Student("z4",24), "ShangHai");
        map.put(new Student("z4",24), "ShangHai");
        map.put(new Student("z6",26), "ShangHai");
        
        Set<Entry<Student,String>> entry = map.entrySet();
        Iterator<Entry<Student,String>> it = entry.iterator();
        while(it.hasNext()){
            Entry<Student,String> en = it.next();
            System.out.println(en.getKey() + "=" + en.getValue());
        }
        
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值