Java学习日记:Map集合

Map接口介绍

现实生活中,我们经常需要成对存储某些信息。比如,我们使用的微信,一个手机号只能对应一个微 信账户。这就是一种成对存储的关系。

Map接口位于java.util包中,常用的实现类有HashMap、TreeMap、HashTable等。

Map集合的特点

1、Map集合一次存储两个对象,一个键对象,一个值对象

2、键对象在集合中是唯一的,可以通过键来查找值

3、HashMap特点:

        1、使用哈希算法对键去重复,效率高,但无序

        2、HashMap是Map接口的主要实现类

map的创建与常用方法案例

public class Demo1 {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"kxbb");
        map.put(2,"kxbd");
        map.put(3,"kxdb");
        map.put(4,"kxdd");
        //可以为空
        map.put(null,"");

        //先化成set集合再使用迭代器
        Set<Integer> integers = map.keySet();

        Iterator<Integer> iterator = integers.iterator();
        while (iterator.hasNext()){
            //利用迭代器得到key,key.get到value
            Integer key = iterator.next();
            String value = map.get(key);
            System.out.println("key:"+key+",value:"+value);
        }
        //长度size
        System.out.println(map.size());

        //判断是否为空
        System.out.println(map.isEmpty());

        //根据key得到value
        System.out.println(map.get(2));

        //判断是否有这个key
        System.out.println(map.containsKey(3));

        //判断这个集合是否有这个value
        System.out.println(map.containsValue("kxbb"));

        //输出map的所有值
        System.out.println(map.values());

        //删除对应的key
        map.remove(2);
        System.out.println(map);

        //清空集合
        map.clear();
        System.out.println(map);
    }
}

注意map没有迭代器所以需要转换成set再使用迭代器

两种办法(会一个即可)

1:keyset《我常用》推荐

案例如下

public class Demo2 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("a",1);
        map.put("b",2);
        map.put("c",3);
        map.put("d",4);
        map.put("a",555);
        Iterator<String> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            String key = iterator.next();
            System.out.println("key:"+key+"   value:"+map.get(key));
        }
    }
}

2.entrySet

// entrySet方法
11 Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
12 // 获取迭代器
13 Iterator<Map.Entry<Integer, String>> iterator = entrySet.iterator();
14 while(iterator.hasNext()) {
15 // 获取Entry对象
16 Map.Entry<Integer, String> next = iterator.next();
17 // 输出map的key和value
18 System.out.println("key: " + next.getKey() + " value: " + next.getValue());
19 }

Hashmap:

HashMap 集合中的 key 不能重复(key可以为null),HashMap 中key为 JavaAPI 中提供的类型元素时,不需要重写元素的 hashCode 和 equals 方法,因 为这两个方法,在 JavaAPI 的每个类中已经重写完毕,如 String 类、Integer 类等。

(当我们自建对象当作key时需要重写hashCode 和 equals 方法)

注意:当在HashMap 中put的key在之前已经存过,则不会重复存储,会覆盖之前key对应的value。

Treemap(排序的时候用且key不为空)

对map的排序(上节课讲过的)案例如下

方法一

public class Demo5 {
    public static void main(String[] args) {
        TreeMap<Teacher,String> map = new TreeMap<>();
        map.put(new Teacher(1,"kxbb"),"99");
        map.put(new Teacher(2,"kxbb"),"99");
        map.put(new Teacher(1,"dddd"),"99");//会覆盖
        map.put(new Teacher(3,"kxbb"),"99");

        Iterator<Teacher> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            Teacher next = iterator.next();
            System.out.println(next+map.get(next));
        }
    }
}
class Teacher implements Comparable<Teacher>{//比较要实现comparable方法
    private int age;
    private String name;

    public Teacher(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Teacher{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Teacher o) {//要是Teacher o
        if (this.age>o.age){
            return 1;
        }else if (this.age<o.age){
            return -1;
        }else {
            return 0;
        }
    }
}

方法二

public class Demo6 {
    public static void main(String[] args) {
        TreeMap<man,String> map = new TreeMap<>(new Comparator<man>() {
            @Override
            public int compare(man o1, man o2) {
                if (o1.getAge()>o2.getAge()){
                    return 1;
                }else if (o1.getAge()<o2.getAge()){
                    return -1;
                }else
                return 0;


                /*if (o1 instanceof man && o2 instanceof man){
                    man t1 = (man)o1;
                    man t2 = (man)o2;
                    return Integer.compare(t1.getAge(), t2.getAge());
                }
                return 0;*/

                
            }
        });
        map.put(new man(1,"kxbb"),"99");
        map.put(new man(2,"kxbb"),"99");
        map.put(new man(1,"dddd"),"99");//会覆盖
        map.put(new man(3,"kxbb"),"99");

        Iterator<man> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            man next = iterator.next();
            System.out.println(next+map.get(next));
        }
    }
}


class man {
    private int age;
    private String name;

    public man(int age, String name) {
        this.age = age;
        this.name = name;
    }

    @Override
    public String toString() {
        return "man{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        man man = (man) o;
        return age == man.age &&
                Objects.equals(name, man.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name);
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

小知识点:

HashMap:线程不安全,效率高,允许key或value为null。

Hashtable:线程安全,效率低,不允许key或value为null。 

工具类:Collections

常用方法:

1:排序(Sort)自然排序

2:混排(Shuffling)打乱

3:反转(Reverse)反着自然排序

4:替换所有的元素(Fill)指定集合替换所有元素

斗地主案列

1.Map

public class Demo7 {
    public static void main(String[] args) {
        //1.创建一个牌盒
        HashMap<Integer,String> map = new HashMap<>();

        //2,创建两个集合放颜色和数字
        ArrayList<String> colors = new ArrayList<>();
        ArrayList<String> numbers = new ArrayList<>();

        //3,给花色,数字赋值   ♥♠♣♦  用工具类COLLECTIONS 方法
        Collections.addAll(colors,"♥","♠","♣","♦");
        Collections.addAll(numbers,"3","4","5","6","7","8","9","10","J","Q","K","A","2");

        //4,装大小王
        int index = 0;
        map.put(index,"大王");
        index++;
        map.put(index,"小王");
        index++;

        //5.嵌套遍历两个集合,生产出所有的牌,并存入map集合
        //外层遍历数字,内层遍历花色
        for (String number : numbers) {
            for (String color : colors) {
                String s = color + number;
                //存入map
                map.put(index,s);
                //计数
                index++;
            }
        }

        //6,洗牌
        //6.1得到所有牌的序号
        Set<Integer> integers = map.keySet();
        ArrayList<Integer> list = new ArrayList<>(integers);

        //6,2洗牌
        Collections.shuffle(list);

        //7,发牌
        ArrayList<Integer> kxbb = new ArrayList<>();//1
        ArrayList<Integer> kxbd = new ArrayList<>();//2
        ArrayList<Integer> kxdb = new ArrayList<>();//3
        ArrayList<Integer> kxdd = new ArrayList<>();//底牌

        for (int i = 0; i < list.size(); i++) {
            if (i<=2){
                kxdd.add(list.get(i));
            }else if (i%3==0){
                kxbb.add(list.get(i));
            }else if (i%3==1){
                kxbd.add(list.get(i));
            }else if (i%3==2){
                kxdb.add(list.get(i));
            }
        }


        //进行系统默认排序
        Collections.sort(kxbb);
        Collections.sort(kxbd);
        Collections.sort(kxdb);
        Collections.sort(kxdd);


        //8,看牌
        for (Integer integer : kxbb) {
            String a = map.get(integer);
            System.out.print(a+" ");
        }
        System.out.println();
        for (Integer integer : kxbd) {
            String b = map.get(integer);
            System.out.print(b+" ");
        }
        System.out.println();
        for (Integer integer : kxdb) {
            String c = map.get(integer);
            System.out.print(c+" ");
        }
        System.out.println();
        for (Integer integer : kxdd) {
            String d = map.get(integer);
            System.out.print(d+" ");
        }
    }
}

2:Arrrylist

public class Work5 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("大王");
        list.add("小王");

        ArrayList<String> colors = new ArrayList<>();
        ArrayList<String> numbers = new ArrayList<>();
        colors.add("♥");
        colors.add("♦");
        colors.add("♠");
        colors.add("♣");
        for (int i = 2; i <=10 ; i++) {
            numbers.add(i+"");
        }
        numbers.add("J");
        numbers.add("Q");
        numbers.add("K");
        numbers.add("A");

        for (String color : colors) {
            for (String number : numbers) {
                list.add(color+number);
            }
        }

        Collections.shuffle(list);

        ArrayList<String> kxbb = new ArrayList<>();
        ArrayList<String> kxbd = new ArrayList<>();
        ArrayList<String> kxdb = new ArrayList<>();
        ArrayList<String> kxdd = new ArrayList<>();
        for (int i = 0; i <list.size(); i++) {
            if (i<=2){
                kxdd.add(list.get(i));
            }else if (i%3==0){
                kxbb.add(list.get(i));
            }else if (i%3==1){
                kxbd.add(list.get(i));
            }else if (i%3==2){
                kxdb.add(list.get(i));
            }
        }
        Collections.sort(kxbb);
        Collections.sort(kxbd);
        Collections.sort(kxdb);
        Collections.sort(kxdd);

        System.out.println(kxbb);
        System.out.println(kxbd);
        System.out.println(kxdb);
        System.out.println(kxdd);

    }
}

课后习题

1:

//1.往一个Map集合中添加若干元素。获取Map中的所有value.
public class Work1 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put(1,"a");
        map.put(2,"b");
        map.put(3,"c");
        map.put(4,"d");

        System.out.println(map.values());
    }
}

2:

//2.使用Map集合存储自定义数据类型Car做键(有品牌和颜色),对应的价格做值。并使用keySet和entrySet两种方式遍历Map集合
public class Work2 {
    public static void main(String[] args) {
        Map<Car,Integer> map = new HashMap<>();
        map.put(new Car("兰博基尼",'橙'),100);
        map.put(new Car("柯尼塞格",'蓝'),200);
        map.put(new Car("法拉利",'黄'),300);
        map.put(new Car("布加迪",'红'),400);
        Iterator<Car> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            Car next = iterator.next();
            System.out.println(next+" "+map.get(next));
        }
    }
}
class Car{
    private String name;
    private char color;

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", color=" + color +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Car car = (Car) o;
        return color == car.color &&
                Objects.equals(name, car.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, color);
    }

    public String getName() {
        return name;
    }

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

    public char getColor() {
        return color;
    }

    public void setColor(char color) {
        this.color = color;
    }

    public Car(String name, char color) {
        this.name = name;
        this.color = color;
    }
}

3:

//3.现在有一个map集合如下:
//Map<Integer,String> map =?new?HashMap<Integer, String>();
//map.put(1,"张三丰");
//map.put(2,"周芷若");
//map.put(3,"汪峰");
//map.put(4,"灭绝师太");
//要求:
//1.遍历集合,并将序号与对应人名打印。
//2.向该map集合中插入一个编码为5姓名为李晓红的信息
//3.移除该map中的编号为1的信息
//4.将map集合中编号为2的姓名信息修改为"周林"
public class Work3 {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"张三丰");
        map.put(2,"周芷若");
        map.put(3,"汪峰");
        map.put(4,"灭绝师太");

        Iterator<Integer> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            Integer next = iterator.next();
            System.out.println("序号:"+next+"   名字:"+map.get(next));
        }

        map.put(5,"李晓红");

        map.remove(1);

        map.put(2,"周林");

        while (iterator.hasNext()){
            Integer next = iterator.next();
            System.out.println("序号:"+next+"   名字:"+map.get(next));
        }
    }
}

这道题有点意思

4:

//4.定义一个泛型为String类型的List集合,统计该集合中每个字符出现的次数。
//
//例如:集合中有”abc " bcd”两个元素,程序最终输出格式为:“a = 1,b = 2,c = 2,d = 1”
public class Work4 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("abc");
        list.add("bcd");
        String s = "";
        for (int i = 0; i< list.size(); i++) {
            s += list.get(i);
        }
        Map<Character,Integer> map = new HashMap<>();
        char[] chars = s.toCharArray();
        for (char c : chars) {
            boolean b = map.containsKey(c);
            if (b){
                map.put(c,map.get(c)+1);
            }else {
                map.put(c,1);
            }
        }
        Iterator<Character> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            Character next = iterator.next();
            System.out.println(next+"="+map.get(next));
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值