一篇文章让你精通:java集合讲解(六,Map)

Posted 韶光不负

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文章让你精通:java集合讲解(六,Map)相关的知识,希望对你有一定的参考价值。

相信大家从头看过来,已经对前面List与Set有了一定的理解,下面我们就需要对集合中最后一个分类进行讲解Map,废话不多说,下面就让我们来看看Map有什么奇妙的地方吧!

目录

Map 

分类

HashMap:

LinkHashMap(HashMap的子类):

TreeMap:

使用Map

HashMap:

 结论:hashMap时(哈希表进行存储)

LinkedHashMap

 结论:LinkedHashMap时(哈希表进行存储)

TreeMap

 结论:TreeMapMap时(哈希表进行存储)

Map常见四种操作

练习map添加学生信息

问题:为什么没有重写hashcode与equals方法没有报错

问题:为什么是4个学生信息,我们添加的是五个学生信息?

Set与Map的关系(面试题)


Map 

  特点:存储的是键值对的映射关系(每一个元素存在键与值,通过得到key找到与之对应value)

分类

 map分为二类,hashmap与treemap

HashMap:

特点:采用hashtable哈希表结构进行存储

优点:快

缺点:无序

LinkHashMap(HashMap的子类):

特点:采用hashtable哈希表结构进行存储,同时使用链表来维持次序

与Hashmap相比优点:有序(添加顺序)

TreeMap:

特点:采用二叉树(红黑树)结构进行存储

优点:比List的查找顺序要快

缺点:没有hashmap速度快

使用Map

Map的常见方法
put添加
size添加个数
get("key")通过key获取value
keySet()
获取key集合
values()
获取value
isEmpty()
判断是否为空
containsKey(“key”)
判断key是否存在
containsValue(“value”)
判断value是否存在,比较内容
replace(key,new 内容)

例:(

replace(12,new Student(10,"xiaoming",18,68.5))

修改key的内容
replace(“key”)
删除key

HashMap:

package com.luo_sf.map;


import java.util.HashMap;
import java.util.Map;
/*
使用map存储国家名称
*/
public class TestMap {
    public static void main(String[] args) {
        //创建Map
        Map<String,String> countries= new HashMap<>();

        //添加
        countries.put("中国","China");
        countries.put("美国","America");

        countries.put("巴西","Brazil");
        countries.put("韩国","Korea");
        //测试相同的key发生什么?
        countries.put("韩国","South Korea");

        //统计
        System.out.println(countries.size());
        //获取
        System.out.println(countries.get("中国"));
        //测试不存在的
        System.out.println(countries.get("日本"));

        //查看相同的key发生结果
        System.out.println(countries);

    }

}

 结论:hashMap时(哈希表进行存储)

1,key:无序,唯一(当我们存储相同的key时,后面value会覆盖前面value)

2,value: 无序 ,不唯一

LinkedHashMap

package com.luo_sf.map;



import java.util.LinkedHashMap;
import java.util.Map;
/*
使用map存储国家名称
*/
public class TestMap {
    public static void main(String[] args) {
        //创建Map
        Map<String,String> countries= new LinkedHashMap<>();

        //添加
        countries.put("中国","China");
        countries.put("美国","America");

        countries.put("巴西","Brazil");
        countries.put("韩国","Korea");
        //测试相同的key发生什么?
        countries.put("韩国","South Korea");

        //统计
        System.out.println(countries.size());
        //获取
        System.out.println(countries.get("中国"));
        //测试不存在的
        System.out.println(countries.get("日本"));

        //查看相同的key发生结果
        System.out.println(countries);

    }

}

 

 结论:LinkedHashMap时(哈希表进行存储)

1,key:有序(添加顺序),唯一(当我们存储相同的key时,后面value会覆盖前面value)

2,value: 无序 ,不唯一

TreeMap

package com.luo_sf.map;
import java.util.Map;
import java.util.TreeMap;

/*
使用map存储国家名称
*/
public class TestMap {
    public static void main(String[] args) {
        //创建Map
        Map<String,String> countries= new TreeMap<>();

        //添加
        countries.put("中国","China");
        countries.put("美国","America");

        countries.put("巴西","Brazil");
        countries.put("韩国","Korea");
        //测试相同的key发生什么?
        countries.put("韩国","South Korea");

        //统计
        System.out.println(countries.size());
        //获取
        System.out.println(countries.get("中国"));
        //测试不存在的
        System.out.println(countries.get("日本"));

        //查看相同的key发生结果
        System.out.println(countries);

    }

}

 

 结论:TreeMapMap时(哈希表进行存储)

1,key:有序(自然顺序,abc...),唯一(当我们存储相同的key时,后面value会覆盖前面value)

2,value: 无序 ,不唯一

Map常见四种操作

创建Map

 Map<String,String> Map名称= new TreeMap<>();

添加键值对

Map名称.put("key","value");

根据key获取value

System.out.println(Map名称.get("key"));

遍历数据

 //遍历Map
        System.out.println(countries);  //toString方法

        //获取key,得到value
        Set<String> keyset = countries.keySet();
        for (String key:keyset) {
            System.out.println(key + "-->" + countries.get(key));
        }

        //获取所以的节点(Entry,相当于哈希表与二叉树中的节点)组成集合
        System.out.println(countries.entrySet());
        //或者
        Set<Map.Entry<String,String>> entrySet=countries.entrySet();
        Iterator<Map.Entry<String,String>> it=entrySet.iterator();
        while (it.hasNext()){
        Map.Entry<String,String> entry=it.next();
            System.out.println(entry);
        }
    }

练习map添加学生信息

创建学生对象

package com.luo_sf.map;

public class Student {
    private int id;
    private String name;
    private int age;
    private Double scpre;

    public Student() {
    }

    public Student(int id, String name, int age, Double scpre) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.scpre = scpre;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public Double getScpre() {
        return scpre;
    }

    public void setId(int id) {
        this.id = id;
    }

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

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

    public void setScpre(Double scpre) {
        this.scpre = scpre;
    }

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

创建map集合

package com.luo_sf.map;

import java.security.KeyStore;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.*;


public class StudentMap {
    public static void main(String[] args) {
        //创建一个map集合
        Map<Integer,Student> map= new HashMap();

        //创建学生信息
        Student stu1= new Student(10,"xiaoming",18,68.5);
        Student stu2= new Student(11,"zhangsan",28,78.5);
        Student stu3= new Student(12,"lishi",8,98.5);
        Student stu4= new Student(13,"wangwu",38,66.5);
        Student stu5= new Student(10,"xiaoming",18,68.5);

        //添加入map中
        map.put(stu1.getId(),stu1);
        map.put(stu2.getId(),stu2);
        map.put(stu3.getId(),stu3);
        map.put(stu4.getId(),stu4);
        map.put(stu5.getId(),stu5);

        //统计人数
        System.out.println(map.size());

        System.out.println(map);

        System.out.println(map.get(12));

        //遍历
        Set<Entry<Integer,Student>>entrySet = map.entrySet();
        for (Entry entry:entrySet) {

            System.out.println(entry.getValue());
        }

    }


}

 

问题:为什么没有重写hashcode与equals方法没有报错

 

 Map<Integer,Student> map= new HashMap();
 map.put(stu5.getId(),stu5);

因为哈希码与key有关跟value无关,我们设置的为Integer(学生的id),在哈希表内部有Integer的hashcode与equals方法,所以没有报错。

问题:为什么是4个学生信息,我们添加的是五个学生信息?

在map中key是唯一的,所以当出现重复的key时,后面value覆盖前面的value。

Set与Map的关系(面试题)

如果Map只存储key,不存储value时,就是与之对应的Set(SET是与之对应Map的key的集合)

以上是关于一篇文章让你精通:java集合讲解(六,Map)的主要内容,如果未能解决你的问题,请参考以下文章

一篇文章让你精通:java集合讲解(练习处理)

一篇文章让你精通:java集合讲解(三,Set)

一篇文章让你精通:java集合讲解(二,LinkList)

一篇文章让你精通:java集合讲解(八,集合的解析与总结)

一篇文章让你精通:java集合讲解

一篇文章让你精通:java集合讲解(四,Set)