博客
关于我
Java(265-278)【Map】
阅读量:454 次
发布时间:2019-03-06

本文共 12917 字,大约阅读时间需要 43 分钟。

1、Map集合概述

是一个接口

 

键是唯一的

 java.util.Map<k,v>集合

Map集合的特点:
     1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
     2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
     3.Map集合中的元素,key是不允许重复的,value是可以重复的
     4.Map集合中的元素,key和value是一一对应

2、Map常用子类

java.util.HashMap<k,v>集合 implements Map<k,v>接口

HashMap集合的特点:
     1.HashMap集合底层是哈希表:查询的速度特别的快
         JDK1.8之前:数组+单向链表
         JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
     2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致

java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合是子类

LinkedHashMap的特点:

     1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
     2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的

3、Map接口中的常用方法

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。

  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。

  • boolean containsKey(Object key) 判断集合中是否包含指定的键。

  • public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。

  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

 

public V put(K key, V value):  把指定的键与指定的值添加到Map集合中。

    返回值:v
        存储键值对的时候,key不重复,返回值V是null
        存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值

 

public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。

    返回值:V
        key存在,v返回被删除的值
        key不存在,v返回null

public class Demo01Map {    public static void main(String[] args) {        show04();    }    /*        boolean containsKey(Object key) 判断集合中是否包含指定的键。        包含返回true,不包含返回false     */    private static void show04() {        //创建Map集合对象        Map
map = new HashMap<>(); map.put("赵丽颖",168); map.put("杨颖",165); map.put("林志玲",178); boolean b1 = map.containsKey("赵丽颖"); System.out.println("b1:"+b1);//b1:true boolean b2 = map.containsKey("赵颖"); System.out.println("b2:"+b2);//b2:false } /* public V get(Object key) 根据指定的键,在Map集合中获取对应的值。 返回值: key存在,返回对应的value值 key不存在,返回null */ private static void show03() { //创建Map集合对象 Map
map = new HashMap<>(); map.put("赵丽颖",168); map.put("杨颖",165); map.put("林志玲",178); Integer v1 = map.get("杨颖"); System.out.println("v1:"+v1);//v1:165 Integer v2 = map.get("迪丽热巴"); System.out.println("v2:"+v2);//v2:null } /* public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。 返回值:V key存在,v返回被删除的值 key不存在,v返回null */ private static void show02() { //创建Map集合对象 Map
map = new HashMap<>(); map.put("赵丽颖",168); map.put("杨颖",165); map.put("林志玲",178); System.out.println(map);//{林志玲=178, 赵丽颖=168, 杨颖=165} Integer v1 = map.remove("林志玲"); System.out.println("v1:"+v1);//v1:178 System.out.println(map);//{赵丽颖=168, 杨颖=165} //int v2 = map.remove("林志颖");//自动拆箱 NullPointerException Integer v2 = map.remove("林志颖"); System.out.println("v2:"+v2);//v2:null System.out.println(map);//{赵丽颖=168, 杨颖=165} } /* public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。 返回值:v 存储键值对的时候,key不重复,返回值V是null 存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值 */ private static void show01() { //创建Map集合对象,多态 Map
map = new HashMap<>(); String v1 = map.put("李晨", "范冰冰1"); System.out.println("v1:"+v1);//v1:null String v2 = map.put("李晨", "范冰冰2"); System.out.println("v2:"+v2);//v2:范冰冰1 System.out.println(map);//{李晨=范冰冰2} map.put("冷锋","龙小云"); map.put("杨过","小龙女"); map.put("尹志平","小龙女"); System.out.println(map);//{杨过=小龙女, 尹志平=小龙女, 李晨=范冰冰2, 冷锋=龙小云} }}

4、遍历map集合找值方式

Map集合的第一种遍历方式:通过键找值的方式

Map集合中的方法:
     Set<K> keySet() 返回此映射中包含的键的 Set 视图。
实现步骤:
    1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
    2.遍历set集合,获取Map集合中的每一个key
    3.通过Map集合中的方法get(key),通过key找到value

public class Demo02KeySet {    public static void main(String[] args) {        //创建Map集合对象        Map
map = new HashMap<>(); map.put("赵丽颖",168); map.put("杨颖",165); map.put("林志玲",178); //1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中 Set
set = map.keySet(); //2.遍历set集合,获取Map集合中的每一个key //使用迭代器遍历Set集合 Iterator
it = set.iterator(); while (it.hasNext()){ String key = it.next(); //3.通过Map集合中的方法get(key),通过key找到value Integer value = map.get(key); System.out.println(key+"="+value); } System.out.println("-------------------"); //使用增强for遍历Set集合 for(String key : set){ //3.通过Map集合中的方法get(key),通过key找到value Integer value = map.get(key); System.out.println(key+"="+value); } System.out.println("-------------------"); //使用增强for遍历Set集合 for(String key : map.keySet()){ //3.通过Map集合中的方法get(key),通过key找到value Integer value = map.get(key); System.out.println(key+"="+value); } }}

5、Entry键值对对象

Map集合遍历的第二种方式:使用Entry对象遍历

Map集合中的方法:

    Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。

实现步骤:

    1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
    2.遍历Set集合,获取每一个Entry对象
    3.使用Entry对象中的方法getKey()和getValue()获取键与值

6、map集合遍历键值对的方式

public class Demo03EntrySet {    public static void main(String[] args) {        //创建Map集合对象        Map
map = new HashMap<>(); map.put("赵丽颖",168); map.put("杨颖",165); map.put("林志玲",178); //1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中 Set
> set = map.entrySet(); //2.遍历Set集合,获取每一个Entry对象 //使用迭代器遍历Set集合 Iterator
> it = set.iterator(); while(it.hasNext()){ Map.Entry
entry = it.next(); //3.使用Entry对象中的方法getKey()和getValue()获取键与值 String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key+"="+value); } System.out.println("-----------------------"); for(Map.Entry
entry:set){ //3.使用Entry对象中的方法getKey()和getValue()获取键与值 String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key+"="+value); } }}

7、Hashmap存储自定义类型键值

    HashMap存储自定义类型键值

    key:Person类型
        Person类就必须重写hashCode方法和equals方法,以保证key唯一
    value:String类型
        可以重复

import java.util.HashMap;import java.util.Map;import java.util.Set;/*    HashMap存储自定义类型键值    Map集合保证key是唯一的:        作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一 */public class Demo01HashMapSavePerson {    public static void main(String[] args) {        show02();    }    /*        HashMap存储自定义类型键值        key:Person类型            Person类就必须重写hashCode方法和equals方法,以保证key唯一        value:String类型            可以重复     */    private static void show02() {        //创建HashMap集合        HashMap
map = new HashMap<>(); //往集合中添加元素 map.put(new Person("女王",18),"英国"); map.put(new Person("秦始皇",18),"秦国"); map.put(new Person("普京",30),"俄罗斯"); map.put(new Person("女王",18),"毛里求斯"); //使用entrySet和增强for遍历Map集合 Set
> set = map.entrySet(); for (Map.Entry
entry : set) { Person key = entry.getKey(); String value = entry.getValue(); System.out.println(key+"-->"+value); } } /* HashMap存储自定义类型键值 key:String类型 String类重写hashCode方法和equals方法,可以保证key唯一 value:Person类型 value可以重复(同名同年龄的人视为同一个) */ private static void show01() { //创建HashMap集合 HashMap
map = new HashMap<>(); //往集合中添加元素 map.put("北京",new Person("张三",18)); map.put("上海",new Person("李四",19)); map.put("广州",new Person("王五",20)); map.put("北京",new Person("赵六",18)); //使用keySet加增强for遍历Map集合 Set
set = map.keySet(); for (String key : set) { Person value = map.get(key); System.out.println(key+"-->"+value); } }}

 

package com.itheima.demo02.Map;import java.util.Objects;public class Person {    private String name;    private  int age;    public Person() {    }    public Person(String name, int age) {        this.name = name;        this.age = age;    }    @Override    public String toString() {        return "Person{" +                "name='" + name + '\'' +                ", age=" + age +                '}';    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Person person = (Person) o;        return age == person.age &&                Objects.equals(name, person.name);    }    @Override    public int hashCode() {        return Objects.hash(name, 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;    }}

8、LinkedHashMap集合

package com.itheima.demo03.Map;import java.util.HashMap;import java.util.LinkedHashMap;/*    java.util.LinkedHashMap
entends HashMap
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。 底层原理: 哈希表+链表(记录元素的顺序) */public class Demo01LinkedHashMap { public static void main(String[] args) { HashMap
map = new HashMap<>(); map.put("a","a"); map.put("c","c"); map.put("b","b"); map.put("a","d"); System.out.println(map);// key不允许重复,无序 {a=d, b=b, c=c} LinkedHashMap
linked = new LinkedHashMap<>(); linked.put("a","a"); linked.put("c","c"); linked.put("b","b"); linked.put("a","d"); System.out.println(linked);// key不允许重复,有序 {a=d, c=c, b=b} }}

9、Hashtable集合 了解:)

java.util.Hashtable<K,V>集合 implements Map<K,V>接口

Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢

HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快

HashMap集合(之前学的所有的集合):可以存储null值,null键

Hashtable集合,不能存储null值,null键

Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了

Hashtable的子类Properties依然活跃在历史舞台
Properties集合是一个唯一和IO流相结合的集合

public class Demo02Hashtable {    public static void main(String[] args) {        HashMap
map = new HashMap<>(); map.put(null,"a"); map.put("b",null); map.put(null,null); System.out.println(map);//{null=null, b=null} Hashtable
table = new Hashtable<>(); //table.put(null,"a");//NullPointerException //table.put("b",null);//NullPointerException table.put(null,null);//NullPointerException }}

10、map集合的练习

练习:

    计算一个字符串中每个字符出现次数

分析:

    1.使用Scanner获取用户输入的字符串
    2.创建Map集合,key是字符串中的字符,value是字符的个数
    3.遍历字符串,获取每一个字符
    4.使用获取到的字符,去Map集合判断key是否存在
        key存在:
            通过字符(key),获取value(字符个数)
            value++
            put(key,value)把新的value存储到Map集合中
        key不存在:
            put(key,1)
    5.遍历Map集合,输出结果

public class Demo03MapTest {    public static void main(String[] args) {        //1.使用Scanner获取用户输入的字符串        Scanner sc = new Scanner(System.in);        System.out.println("请输入一个字符串:");        String str = sc.next();        //2.创建Map集合,key是字符串中的字符,value是字符的个数        HashMap
map = new HashMap<>(); //3.遍历字符串,获取每一个字符 for(char c :str.toCharArray()){ //4.使用获取到的字符,去Map集合判断key是否存在 if(map.containsKey(c)){ //key存在 Integer value = map.get(c); value++; map.put(c,value); }else{ //key不存在 map.put(c,1); } } //5.遍历Map集合,输出结果 for(Character key :map.keySet()){ Integer value = map.get(key); System.out.println(key+"="+value); } }}

11、JDK9对集合添加的优化 of

新的List、Set、Map的静态工厂方法可以更方便地创建集合的不可变实例。

JDK9的新特性:

    List接口,Set接口,Map接口:里边增加了一个静态的方法of,可以给集合一次性添加多个元素
    static <E> List<E> of​(E... elements)
    使用前提:
        当集合中存储的元素的个数已经确定了,不在改变时使用
注意:
    1.of方法只适用于List接口,Set接口,Map接口,不适用于接口的实现类
    2.of方法的返回值是一个不能改变的集合,集合不能再使用add,put方法添加元素,会抛出异常
    3.Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常

public class Demo01JDK9 {    public static void main(String[] args) {        List
list = List.of("a", "b", "a", "c", "d"); System.out.println(list);//[a, b, a, c, d] //list.add("w");//UnsupportedOperationException:不支持操作异常 //Set
set = Set.of("a", "b", "a", "c", "d");//IllegalArgumentException:非法参数异常,有重复的元素 Set
set = Set.of("a", "b", "c", "d"); System.out.println(set); //set.add("w");//UnsupportedOperationException:不支持操作异常 //Map
map = Map.of("张三", 18, "李四", 19, "王五", 20,"张三",19);IllegalArgumentException:非法参数异常,有重复的元素 Map
map = Map.of("张三", 18, "李四", 19, "王五", 20); System.out.println(map);//{王五=20, 李四=19, 张三=18} //map.put("赵四",30);//UnsupportedOperationException:不支持操作异常 }

12、Debug追踪

Debug调试程序:

    可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug
使用方式:
    在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到哪里)
    右键,选择Debug执行程序
    程序就会停留在添加的第一个断点处
执行程序:
    f8:逐行执行程序
    f7:进入到方法中
    shift+f8:跳出方法
    f9:跳到下一个断点,如果没有下一个断点,那么就结束程序
    ctrl+f2:退出debug模式,停止程序
    Console:切换到控制台

 

转载地址:http://lddbz.baihongyu.com/

你可能感兴趣的文章
android:使用audiotrack 类播放wav文件
查看>>
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
查看>>
shell编程(六)语言编码规范之(变量)
查看>>
vimscript学习笔记(二)预备知识
查看>>
Android数据库
查看>>
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
查看>>
23种设计模式一:单例模式
查看>>
python-day3 for语句完整使用
查看>>
weblogic之cve-2015-4852
查看>>
Java注释
查看>>
使用mybatis-generator生成底层
查看>>
6 个 Linux 运维典型问题
查看>>
Failed to get D-Bus connection: Operation not permitted解决
查看>>
MySQL-时区导致的时间前后端不一致
查看>>
bcolz的新操作
查看>>
netcore中使用session
查看>>
【wp】HWS计划2021硬件安全冬令营线上选拔赛
查看>>
Linux探测工具BCC(可观测性)
查看>>
mcrypt加密以及解密过程
查看>>
go等待N个线程完成操作总结
查看>>