Map

map映射关系

a集合当中每一个元素,都可以在b集合当中找到一个唯一的一个值与之对应

a集合当中的元素不能够重复(set)

a集合当中的元素称他是一个key(键)

Map当做是一个字典(dict)

内部维护了set和list集合

map不同的名称,是根据 左边set的结构,比如HAshMap左边就是HashSet,LinkedHashMAp就是LinkedHashset,TreeMap就是TreeSet

hashMap

package com.company;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        //map当中的元素并不是有序的
        Map<String, Object> map = new HashMap<>();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");
        map.put("key4","value4");
        map.put("key5","value5");
        System.out.println(map);

        //获取a集合
        Set<String> set =map.keySet();
        System.out.println(set);
        //获取b集合
        Collection<Object> values=map.values();
        System.out.println(values);
    }
}

常用方法

package com.company;

import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        //map当中的元素并不是有序的
        Map<String, Object> map = new HashMap<>();
        map.put("李四",20);
        map.put("张三",20);
        map.put("张三",123);
        System.out.println(map.get("张三"));//根据键取值 值为123

        System.out.println(map);//{李四=20, 张三=123}
        map.remove("李四");//删除
        System.out.println(map);//{张三=123}
        System.out.println(map.size());//打印长度,为1
        map.clear();//清空元素
        System.out.println(map);//{}
    }
}

遍历

根据迭代器取出set来获取HashMap的值

package com.company;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("李四",20);
        map.put("张三",20);
        map.put("王五",123);
        Set<String> allKeys=map.keySet();
        Iterator<String> it=allKeys.iterator();
        while (it.hasNext()){
            String key= it.next();
            System.out.println(map.get(key));
        }


    }
}

使用entry遍历

package com.company;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("李四",20);
        map.put("张三",20);
        map.put("王五",123);

        //获取所有的key-value对象entry对象
        //entry是定义在map内部当中的一个接口
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> next = iterator.next();//就是一个实体的entry对象
            System.out.println(next);
        }
    }
}

foreach遍历

package com.company;
import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<>();
        map.put("李四",20);
        map.put("张三",20);
        map.put("王五",123);
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
        }
    }
}

HashMap特性

以上是Map接口的公有的特性,接下来讲述Hashmap自己的特性

通过覆盖Equals与HashCode去重

package com.company;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

class Student{
    String name;
    Integer age;
    Student (String name,Integer age){
        this.name=name;
        this.age=age;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student)) return false;
        Student student = (Student) o;
        return name.equals(student.name) &&
                age.equals(student.age);
    }

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

public class Main {

    public static void main(String[] args) {


        Map<Student, String> hm = new HashMap<>();
        hm.put(new Student("张三",20),"北京");
        hm.put(new Student("张三",20),"深圳");
        hm.put(new Student("李四",20),"深圳");
        System.out.println(hm);

    }
}

LinkedHashMap

HashMap的子类

添加的元素都是有序的

package com.company;
import java.util.LinkedHashMap;



public class Main {

    public static void main(String[] args) {
        //添加的元素师有顺序的,按照添加顺序来排序
        LinkedHashMap<String, Integer> hm = new LinkedHashMap<>();
        hm.put("张三",20);
        hm.put("李四",20);
        hm.put("王五",20);
        System.out.println(hm);

    }
}

TreeMap

和TreeSet同理

想要自己定义对象排序就要覆盖Comparable<>

对set不了解的,可以查看文章

https://www.nasuiyile.cn/143.html#TreeSet

hashmap与hashTable区别

hashmap与hashTable区别于共同点底层都是Hash算法,都是双列集合

1.区别HashMap是线程不安全,效率比较高,1.2版本才有

2.HashTable是线程安全的效率不高1.0之前就有

HashMap可以存nullHashTable不可以

Last modification:April 22, 2022
如果觉得我的文章对你有用,请随意赞赏