Java筑基26-集合04-Map

目录

一、Map接口特点

1)语法特点

2)底层逻辑

二、Map接口方法

1.Map体系图

2.常用方法

3.Map三种遍历方式


一、Map接口特点

1)语法特点

import com.feiyang.static1.main;
import java.util.HashMap;

/**
 * @author: 程序员飞扬
 * @description:
 */
public class Map_ {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("no1","张三丰");//k-v
        hashMap.put("no2","杨逍");//k-v
        hashMap.put("no2","韦一笑");//k重复时,v会被替换
        System.out.println(hashMap);

        hashMap.put("no3","周芷若");
        hashMap.put("no4","周芷若");//k不能重复,v可以重复
        System.out.println(hashMap);

        hashMap.put(null,null);//k-v可以为null
        hashMap.put("no5",null);
        System.out.println(hashMap);
        
        hashMap.put(1,"赵敏");
        hashMap.put(new Object(),"小昭");
        System.out.println(hashMap);
    }
}

输出:

{no2=韦一笑, no1=张三丰, no4=周芷若, no3=周芷若}

{no2=韦一笑, null=null, no1=张三丰, no4=周芷若, no3=周芷若, no5=null}

{no2=韦一笑, null=null, no1=张三丰, 1=赵敏, no4=周芷若, no3=周芷若, no5=null, java.lang.Object@4554617c=小昭}

2)底层逻辑

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

/**
 * @author: 程序员飞扬
 * @description:
 */
public class MapSource_ {
    public static void main(String[] args) {
        Map hashMap = new HashMap();

        /**
         * put()
         */
        hashMap.put("no1","张三丰");//k-v
        hashMap.put("no2","杨逍");//k-v
        //hashMap.put(new Car_(),new Person_());
        System.out.println(hashMap);//{no2=杨逍, no1=张三丰}

        /**
         * get(key)
         */
        System.out.println(hashMap.get("no1"));//张三丰

        /**
         * 1.k-v 最后是 HashHap$Node node = newNode(hash, key, value, null)
         *
         * 2.k-v为了方便程序员的遍历,还会创建EntrySet集合,该集合存放的元素类型Entry,而一个Entry对象就有
         * k,v EntrySet<Entry<K,V» 即:transient Set<Map.Entry<K,V» entrySet;
         *
         * 3. entrySet巾,定义的类型是Map.Entry,但是实际上存放的还足HashMap$Node
         * 这时因为 static class Node<K,V> implements Map.Entry<K,V>
         *
         * 4. 当把HashtMap$Node对象存放到entrySet就方便我们的遍历,因为Map.Entry提供了重要方法
         * K getKey(); V getValue();
         *
         */


        /**
         * entrySet()
         */
        Set set = hashMap.entrySet();//返回entrySet,方便遍历
        for (Object obj : set) {
            Map.Entry entry = (Map.Entry)obj;
            System.out.println(entry.getKey() + "-" + entry.getValue());//no2-杨逍
                                                                        //no1-张三丰
        }

        /**
         * keySet()
         */
        Set set1 = hashMap.keySet();//返回
        System.out.println("set1=" + set1.getClass());//set1=class java.util.HashMap$KeySet
        for (Object o : set1) {
            System.out.print(o + " ");//no2 no1
        }

        System.out.println();

        /**
         * values()
         */
        Collection values = hashMap.values();
        System.out.println("values=" + values.getClass());//values=class java.util.HashMap$Values
        System.out.println(values);//[杨逍, 张三丰]
    }
}

class Car_{

}

class Person_{

}

二、Map接口方法

1.Map体系图

2.常用方法

3.Map三种遍历方式

import java.util.*;

/**
 * @author: 程序员飞扬
 * @description:
 */
public class MapFor {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("邓超","孙俪");
        map.put("王宝强","马蓉");
        map.put("宋哲","马蓉");
        map.put("肖战",null);
        map.put(null,"刘亦菲");
        map.put("鹿晗","关晓彤");


        //第一种:通过keySet方式
        System.out.println("第一种:通过keySet方式");
        Set keys = map.keySet();
        Iterator iterator = keys.iterator();
        while(iterator.hasNext()){
            Object key = iterator.next();
            Object value = map.get(key);
            System.out.println(key + ":" + value);
        }
        System.out.println("--------------------------");
        for (Object key : keys) {
            System.out.println(key + "-" + map.get(key));
        }

        //第二中:把所有values取出
        System.out.println("第二中:把所有values取出");
        Collection values = map.values();
        Iterator iterator1 = values.iterator();
        while(iterator1.hasNext()){
            Object value = iterator1.next();
            System.out.println(value);
        }
        System.out.println("--------------------------");
        for (Object value : values) {
            System.out.println(value);
        }

        //第三种:通过EntrySet来获取k-v
        System.out.println("第三种:通过EntrySet来获取k-v");
        Set entrySet = map.entrySet();
        Iterator iterator2 = entrySet.iterator();
        while(iterator2.hasNext()){
            Object obj = iterator2.next();
            Map.Entry entry = (Map.Entry)obj;
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }

        System.out.println("--------------------------");
        for (Object  o: entrySet) {
            Map.Entry entry = (Map.Entry)o;
            System.out.println(entry.getKey() + "-" + entry.getValue());
        }
    }
}

输出:

第一种:通过keySet方式

邓超:孙俪

null:刘亦菲

王宝强:马蓉

鹿晗:关晓彤

宋哲:马蓉

肖战:null

--------------------------

邓超-孙俪

null-刘亦菲

王宝强-马蓉

鹿晗-关晓彤

宋哲-马蓉

肖战-null

第二中:把所有values取出

孙俪

刘亦菲

马蓉

关晓彤

马蓉

null

--------------------------

孙俪

刘亦菲

马蓉

关晓彤

马蓉

null

第三种:通过EntrySet来获取k-v

邓超:孙俪

null:刘亦菲

王宝强:马蓉

鹿晗:关晓彤

宋哲:马蓉

肖战:null

--------------------------

邓超-孙俪

null-刘亦菲

王宝强-马蓉

鹿晗-关晓彤

宋哲-马蓉

肖战-null

4.HashMap小结

三、HashMap源码解读

1.HashMap底层机制

2.HashMap源码剖析

案例:

import java.util.HashMap;

/**
 * @author:程序员飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class HashMapSource1 {
    public static void main(String[] args) {
        HashMap hashMap = new HashMap();
        hashMap.put("java",10);
        hashMap.put("python",20);
        hashMap.put("java",20);
        System.out.println(hashMap);
    }
}

第一步:创建hashMap对象(第10行代码)

第二步:执行第11行代码

进入put()方法

①hash(key)方法,经过算法得到key的哈希运算后的值 ((key的哈希值)异或运算(哈希值的无符号右移16位))

^/>>>,位运算,详见《Java筑基05-进制&位运算》

②进入putVal方法

③初始化hashMap容积

④创建Node

第三步:执行第12行代码

第四步:执行13行代码

如果数据量小,不需要树化,就到此为止

分析完毕。

四、HashTable

1.hashTable使用

2.hashTable扩容

3.hashMap与hashTable对比

4.Properties类

/**
 * @author:程序员飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class Properties_ {
    public static void main(String[] args) {
        Properties properties = new Properties();
        //增
        properties.put("ll",11);
        properties.put("pp",22);
        properties.put("tt",33);
        //properties.put(null,33);
        //properties.put("ss",null);//键和值都不能为空,否则抛异常NullPointerException

        //删
        properties.remove("ll");

        //改
        properties.put("tt",44);

        //查
        properties.get("pp");

        System.out.println(properties);
    }
}
输出:

{pp=22, tt=44}

五、TreeMap

import java.util.Comparator;
import java.util.TreeMap;

/**
 * @author:程序员飞扬
 * @公众hao:程序员飞扬
 * @description:
 */
public class TreeMap_ {
    public static void main(String[] args) {

        //按key字母排序
        /*TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).compareTo(((String)o2));
            }
        });*/
        /*treeMap.put("aaa","aaa");
        treeMap.put("bbb","bbb");
        treeMap.put("ddd","ddd");
        treeMap.put("ccc","ccc");*/
        //System.out.println(treeMap);输出:{a=aaa, bb=bbb, ccc=ccc, ddd=ddd}


        //按key的长度排序,如果key长度相同,value会被替换
        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length() - (((String)o2).length());
            }
        });
        /*treeMap.put("aaa","aaa");
        treeMap.put("bbb","bbb");
        treeMap.put("ddd","ddd");
        treeMap.put("ccc","ccc");*/

        treeMap.put("a","aaa");
        treeMap.put("bb","bbb");
        treeMap.put("ccc","ccc");
        treeMap.put("ddd","ddd");
        System.out.println(treeMap);//{a=aaa, bb=bbb, ccc=ddd}
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员飞扬

赠人玫瑰,手有余香,感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值