java中映射关系Map

Map

  • 用来描述数学中的映射关系:
    存在两个集合A,B,在f条件下,对于A中的每个元素,在B中都能找到唯一确定对的元素与其相对应。
    f: A->B
Map简介

严格上来说,Map没有继承Collection接口,并不是集合。Map仅仅表示A,B之间的关系,由于其能存储数据,所以习惯性的称其为集合。

  • Map接口的关系图

这里写图片描述

Map的key-value

每次向Map中存储数据时,都应该同时存储两个数据key和value。
这里写图片描述

key一般使用不可改变的量String类型。

Map的实现类
  • HashMap,LinkedHashMap,TreeMap
    三个常用的类,后面会重点介绍。
    HashMap:哈希算法,链表结构,在java8里,当一个哈希值所对应的value达到一定值时,会从链表变为红黑树。
    LinkedHashMap:链表和哈希算法
    TreeMap:红黑树算法

  • Hashtable
    HashMap的前身,是线程安全的。不允许对象为Null,在HashMap中允许对象为null。由于Hashtable性能极低,现在已经使用。

  • Properties
    key和value只能是String.
    是一个比较重要的类,在IO问题用的比较多,加载资源文件。

Map实例

给出一个字符串,计算出每个字母出现的次数

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

public class HashMapDemo {

    /*
     * 需求:
     *计算出str字符串中每个字母出现的次数。
     **/
    public static void main(String[] args) {
        String str="vjofnkjcvnxaoixlalaaaoiovg";
        //先将字符串转化为字符数组的形式,方便对其进行迭代
        //方法:使用String类中的方法toCharArray();
        char[] c=str.toCharArray();
        //由于需要存储两个数据,所以选用Map
        //——如果想要有序可以用TreeMap
        Map<Character,Integer> map=new HashMap<>();
        for (char key : c) {
            Integer value=map.get(key);
            //map里面有Key,则令其Value++,否则置value为1;
            if(map.containsKey(key)){ 
                map.put(key, value+1);
            }
            else{
                map.put(key, 1);
            }
        }
        System.out.println(map);
    }
}
//输出:{a=5, c=1, v=3, f=1, g=1, x=2, i=2, j=2, k=1, l=2, n=2, o=4}
Set,List,Map之间的转换

一般很少用到转换,在一开始选择的时候尽量选择正确的集合

  • List->Set:使用构造器
    Set< String> set=new HashSet<>(list);
    //此时会消除list中重复的元素

  • Set->List:使用构造器
    List< String> list=new ArrayList<>(set);
    //此时set中消除的重复的元素不会再恢复

  • Map不能直接与List和Set相互转换,但是可以利用Map中的方法进行间接转换

总结
  • Map 的应用很广泛
    与JavaBean对象 的转换和做缓存(工具箱)。
    javaBean对象:多对属性名=属性值(ps:不是字段名)。

  • Set,List,Map在有些情况下并不是单独使用的,偶尔会综合使用(集合也是对象),所以可以嵌套使用。

实例:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class MapDemo {

    public static void main(String[] args) {
        /*
         * Set 班级
           Map 学院
           List 学校
           */
        //班级1 的学生
        Set<String> name1=new HashSet<>();
        name1.add("tom");
        name1.add("mary");
        name1.add("aliy");
        //班级12的学生
        Set<String> name2=new HashSet<>();
        name2.add("jery");
        name2.add("will");
        name2.add("slina");

        //学院A
        Map<String,Set<String>> class1=new HashMap<>();
        class1.put("小班", name1);
        class1.put("大班", name2);
        //学院B
        Map<String,Set<String>> class2=new HashMap<>();
        class2.put("小班", name1);
        class2.put("大班", name2);

        //学校
        List<Map<String,Set<String>>> school=new ArrayList<>();
        school.add(class1);
        school.add(class2);

        System.out.println(school);

        /*[{小班=[tom, aliy, mary], 大班=[jery, slina, will]}, 
         {小班=[tom, aliy, mary], 大班=[jery, slina, will]}]
         */
    }

}

开心,集合终于学完了,嘿嘿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值