java笔记--Map集合框架

Map:一次添加一对元素。Collection一次添加一个元素。

Map也称为双列集合,Collection集合称为单列集合。其实map集合中存储的就是键值对。map集合中必须保证键的唯一性。

常用的方法:

1,添加。
value put(key,value):返回前一个和可以关联的值,如果没有返回null。

2,删除。
void clear():清空map集合。
value remove(key):根据指定的key删出这个键值对。

3,判断。
boolean containsKey(key)
boolean containsValue(value)
boolean isEmpty()

4,获取。
value get(key):通过键获取值,如果没有该键返回null。
当然可以通过返回bull,来判断是否包含指定键。
int size():获取键值对的个数。

public class MapDemo {

    public static void main(String[] args) {
        
        Map map=new HashMap();
        method_2(map);
        method(map);
    }

    private static void method(Map map) {//学好和姓名

        //添加元素
        System.out.println(map.put(8, "wangcai"));//输出为null
        System.out.println(map.put(8, "xiaoqiang"));//存相同键,值会覆盖//输出为wangcai
        map.put(2, "value");
        map.put(7, "vhhd");
        
        //删除
        System.out.println("remove:"+map.remove(2));
        
        //判断
        System.out.println("containskey:"+map.containsKey(7));
        
        //获取
        System.out.println("get:"+map.get(6));
        
        System.out.println(map);
        
    }

    private static void method_2(Map map) {

        map.put(8,"zhaoliu");
        map.put(2,"zhaoliu");
        map.put(7, "xiaoqiang");
        map.put(6,"wangcai");
        
        Collection values=map.values();
        
        Iterator it2=values.iterator();
        while(it2.hasNext()){
            System.out.println(it2.next());
        }
        /*
        通过Map转成set就可以迭代。
        找到另一种方法。enteySet。。
        该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的集合就是Map.Entry类型(内部接口、嵌套类)
        */
        Set> entrySet=map.entrySet();
        
        Iterator> it=entrySet.iterator();
        
        while(it.hasNext()){
            Map.Entry me=it.next();
            Integer key=me.getKey();
            String value=me.getValue();
            System.out.println(key+": :"+value);
        }
    }

}
/*
Map.Entry原理:

interface MyMap{
    public static interface MyEntry{//内部接口
        void get();
    }
}

class MyDemo implements MyMap.MyEntry{
    public void get(){//重写get方法
        
    }
}

类似于:
class Outer{
    static class Inner{
        static void show(){}
    }
}
然后在main里被直接调用:
Outer.Inner.show();
*/

运行:
java笔记--Map集合框架_第1张图片
Map常用的子类:

|--Hashtable:内部结构是哈希表,是同步的。不允许null作为键,null作为值。
       |--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。

|--HashMap:内部结构是哈希表,不是同步的。允许null作为键和值。

|--TreeMap:内部结构地二叉树,不是同步的。可以对Map集合中的键进行排序。

HashMapDemo:

public static void main(String[] args) {
        
        /*
        将学生对象和学生归属地通过键与值存到map集合中
        */
        
        HashMap hm=new HashMap();
        
        hm.put(new Student("lisi",38), "北京");
        hm.put(new Student("zhaoliu",24), "上海");
        hm.put(new Student("xiaoqiang",31), "沈阳");
        hm.put(new Student("wqangcai", 28),"大连");
        hm.put(new Student("zhaoliu",24), "铁岭");//在person中重写覆盖了hashcode和equals去重
        
        /*Set keySet=hm.keySet();
        Iterator it=keySet.iterator();可直接合并*/
        
        Iterator it=hm.keySet().iterator();
        while(it.hasNext()){
            Student key=it.next();
            String value=hm.get(key);
            System.out.println(key.getName()+": "+key.getAge()+"--"+value);
        }
    }

运行:

TreeMapDemo:

public static void main(String[] args) {
        
        TreeMap tm=new TreeMap(new ComparatorByName());

        tm.put(new Student("lisi",38), "北京");
        tm.put(new Student("zhaoliu",24), "上海");
        tm.put(new Student("xiaoqiang",31), "沈阳");
        tm.put(new Student("wqangcai", 28),"大连");
        tm.put(new Student("zhaoliu",24), "铁岭");
        
        Iterator> it = tm.entrySet().iterator();
        
        while(it.hasNext()){
            Map.Entry me = it.next();
            Student key = me.getKey();
            String value = me.getValue();
            
            System.out.println(key.getName()+":"+key.getAge()+"---"+value);
        }
    }

运行:

LinkesHashMap:

public static void main(String[] args) {
        
        HashMap hm=new LinkedHashMap();
        
        hm.put(7, "zhouqi");
        hm.put(3, "zhangsam");
        hm.put(1, "qianyi");
        hm.put(5, "wangwu");

        Iterator> it=hm.entrySet().iterator();
        
        while(it.hasNext()){
            Map.Entry me=it.next();
            
            Integer key=me.getKey();
            String value=me.getValue();
            
            System.out.println(key+": "+value);
        }
    }

运行:
练习:

“fdgavcbsacdfs“获取该字符串中,每一个字母出现的次数。
要求打印结果是:a(2)b(1)...;
思路:
对于结果的分析发现,字母和次数之间存在着映射关系。而且这种关系很多。
很多就需要存储,能存储映射关系的容器有数组和Map集合。
关系一:方式有序编号吗?没!
那就是使用Map集合。又发现可以保证唯一性的一方具备着a b c...
所以可以使用TreeMap集合。

这个集合最终应该存储的是字母和次数的对应关系。

1,因为操作的是字符串的字母,所以先将字符串变成字符数组。
2,遍历字符数组,用每一个字母作为键去查Map集合这个表,看看集合中是否有这个元素。
如果该字母键不存在,就将该字母作为键 1作为值存储到map集合中。
如果该字母键存在,就将该字母键对应值取出并+1,再将该字母和+1后的值存储到map集合中,
键相同值会覆盖。这样就记录住了该字母的次数。
3,遍历结束,map集合就记录所有字母出现次数。

public class MapTest {

    public static void main(String[] args) {
        
        String str="fdgav    +cbsacdfs";
        
        String s=getCharCount(str);
        
        System.out.println(s);
    }

    private static String getCharCount(String str) {
        
        //将字符串变成字符数组
        char[] chs=str.toCharArray();
        
        //定义map集合表
        Map map=new TreeMap();
        
        for(int i=0;i='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z'))//只取字母
          //if(!(Character.toLowerCase(chs[i])>='a' && Character.toLowerCase(chs[i])<='z'))
                continue;*/
            
            //将数组中的字母作为键去查map表
            Integer value=map.get(chs[i]);
            /*
            //判断值是否为null
            if(value==null){
                map.put(chs[i], 1);
            }else{
                map.put(chs[i], value+1);
            }
            */
            int count=1;
            if(value!=null){
                count=value+1;
            }
            map.put(chs[i], count);
        }
//      return map.toString();
        return mapToString(map);
    }

    private static String mapToString(Map map) {
        
        StringBuilder sb=new StringBuilder();
        
        Iterator it=map.keySet().iterator();
        
        while(it.hasNext()){
            Character key=it.next();
            Integer value=map.get(key);
            
            sb.append(key+"("+value+")");
        }
        return sb.toString();
    }

运行:

Map有映射关系,在查表法中的应用较为多见。,可以有限考虑。

public static void main(String[] args) {

        /*
         * Map在有映射关系时,可以优先考虑。
         * 
         * 在查表法中的应用较为多见。
         */
        
        String week = getWeek(1);
        System.out.println(week);
        
        System.out.println(getWeekByMap(week));
    }
    public static String getWeekByMap(String week){
        
        Map map = new HashMap();
        
        map.put("星期一","Mon");
        map.put("星期二","Tus");
        map.put("星期三","Wes");
        map.put("星期日","Sun");
        map.put("星期天","Sun");
        
        return map.get(week);
    }
    
    
    public static String getWeek(int week){
        
        if(week<1 || week>7)
            throw new RuntimeException("没有对应的星期,请您重新输入");
        
        String[] weeks = {"","星期一","星期二"};
        
        return weeks[week];
    }

你可能感兴趣的:(java笔记--Map集合框架)