java map keyset_Java_Map集合

Map接口 Map<K,V>

一.

1.Map接口有两个泛型,一个是K(key)表示键,一个是V(value)表示值,与Collection不同,Collection接口只有一个泛型Collection<E>

2.Map接口也在java.util包中

3.Map介绍:

是将键映射到值的对象,一个映射不能包含重复的键(K是唯一的),每个键最多只能映射到一个值(意思就是键(K)是唯一的,每个键(K)和值(V)的关系是一一对应的。键(K)和值(V)的泛型可以相同也可以不同

二.

与Collection集合做对比:

1.Collection集合只有一个泛型Collection<E>,而Map集合有两个泛型 Map<K,V>。且K的值不能重复,在Map中每个元素包含两个值(一个键,一个值,且一个键对应一个值),而Collection集合里面只有一个值。

3465e4442aa034ebf7db9ebe17a7a4d1.png

三.Map接口的常用子类(实现类)

3.1 HashMap<K,V>

HashMap<K,V>的底层是哈希表(数组+链表/红黑树),对比HashSet可知,HashSet只是实现了HashMap里面的K(键),因为键是不能重复存储的所以HashSet不能够存储重复元素

HashMap<K,V>集合是一个无序的集合,所以不可以保证映射的顺序,是不同步的(多线程),意味着速度快

HashMap的子类linkedHashMap(和LinkedHashSet一样的,就是底层多了一个链表记录顺序,所以LinkedHashMap是有序的,HashMap是无序的)

3.1.1 HashMap<K,V>中的常用方法

导包:

import java.util.HashMap;

创建HashMap对象:

HashMap<泛型1,泛型2> 对象名= new HashMap<>();

01:给HashMap对象添加元素

put(K key,V value)方法,这个方法如果K(键)不在HashMap里面存在,就会返回null,并使得,value覆盖null。如果K已经存在,返回的是原本K对应的value值,然后新的value值覆盖原来的value值。

e9326298c8f6984923a712f879933322.png

图中可以看到黄玲的年龄的值被覆盖了

02:找K(键)的对应的的value值

get(Object K)方法;返回的是K对应的value的值

7939a68be488e48f80d92d78b885bfb2.png

03:通过K把键值对删了(元素)

remove(Object K),删掉对应的K对应的键值对,返回被删除的V(value),若K不存在返回null(也就是说可以通过remove方法判断K存不存在)

傻子不存在所以返回值为null

ef5f6f49e0264db707903324c79b1961.png

删除后可以发现黄玲的键值对不在Map集合里了

04:判断K(键)是否存在于对应的HashMap<K,V>中

containKey(Object K);返回boolean值,存在返回ture,不存在返回false

efc89de0372a8c0d8f5d5b3bb57876f2.png

05:上面示例的所有代码

import java.util.HashMap;

public class Demo01Map {
    public static void main(String[] args) {
    demo01();
    }

    private static void demo01() {
        HashMap<String,Integer> hsm=new HashMap<>();//创建map对象,存人物及对应的年龄
        hsm.put("黄玲",19);//用put方法添加键值对(map元素)
        hsm.put("曹操",22);
        hsm.put("典韦",20);
        hsm.put("黄玲",18);
        Integer hl = hsm.get("黄玲");//通过传入键K获得对应的value,可知黄玲为19
        Integer tc = hsm.get("天才");//因为不存在K(天才),所以返回值为null
        System.out.println("黄玲的value"+hl);//黄玲的value
        System.out.println("天才的value"+tc);//天才的value
        System.out.println(hsm);//打印HashMap

        System.out.println("==============");
        Integer huangling = hsm.remove("黄玲");
        Integer shazi = hsm.remove("傻子");
        System.out.println("删除黄玲返回的value"+huangling);
        System.out.println("删除傻子返回的value"+shazi);

        System.out.println("###########################");
        boolean bajie = hsm.containsKey("猪八戒");
        boolean dianwei = hsm.containsKey("典韦");
        System.out.println("有八戒吗?"+bajie);
        System.out.println("有典韦吗?"+dianwei);



    }

}

四.Map集合遍找值:

4.1 keySet();方法

作用:把Map集合的所有key取出来放到一个Set集合里面

例如一个HashMap集合{典韦=20, 曹操=22, 黄玲=18}

通过keySet方法可以取出典韦,曹操,黄玲三个键

历Map集合其实就是对返回的Set集合进行遍历输出,这里可以使用增强for循环or'迭代器,然后通过get方法获取对应key的value

25d3642c3b220475c8f28858b3876913.png
import java.util.HashMap;
import java.util.Set;

public class Demo02keySet {
    public static void main(String[] args) {
        demo02();
    }

    private static void demo02() {
        HashMap<String,Integer> hsm=new HashMap<>();//创建map对象,存人物及对应的年龄
        hsm.put("黄玲",19);//用put方法添加键值对(map元素)
        hsm.put("曹操",22);
        hsm.put("典韦",20);

        System.out.println(hsm);//打印Map集合
        Set<String> set = hsm.keySet();//通过keySet方法将HashMap集合的所有键返回到一个Set集合里面
        System.out.println(set);//打印Set集合
        //遍历Map集合其实就是对返回的Set集合进行遍历输出,这里可以使用增强for循环or'迭代器
        for (String key:set){
            System.out.println(key+hsm.get(key));//通过get方法获取对应key的value
        }

    }
}

五.LinkedHashMap

LinkedHashMap集合和HashMap的区别在于底层比HashMap多了一个链表,所以LinkedHashMap是有序的(存入的顺序就是取出的顺序),而HashMap是无序的

六.Hashtable集合

在包java.util.Hashtable,实现了Map<K,V>接口,底层也是哈希表,是一个线程安全的集合(单线程),而且速度慢

HashMap是线程不安全的集合(多线程),速度快

Hashtable和别的集合的区别:Hashtable集合不可以存储null(无论是K键还是V值都不可以),其他集合可以,Hashtable已经被取代了,但它的一个子类Properties仍然和活跃,经常使用

六:应用:计算一个字符串的每个字符的出现次数

6.1 输入一个字符串(Scanner方法)

6.2 将字符串以字符的方式存入(toCharArray方法)

其他代码和解释如下图

b93516ec0b97e39508889ceede967a89.png
import java.util.HashMap;
import java.util.Scanner;
//value用来存储字符出现的次数
//K键用来存储字符
public class StringText {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("输入字符串");
        String s=sc.next();//s接收字符
        HashMap<Character,Integer> hm=new HashMap<>();//泛型Character,and Integer
     for (char c:s.toCharArray()){//用toCharArray转化s成一个字符数组,遍历
         if (hm.containsKey(c)){//如果已经存在了字符c(K键),取出value,更新
             Integer value=hm.get(c);//获取c的value值
             value++;
             hm.put(c,value);//覆盖
         }
         else {//K不存在,第一次存,更新value为1
             hm.put(c,1);
         }

     }
     
    }
}

希望文章对你认识Map集合有帮助

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值