一篇读懂Map及HashMap--基础入门

Map

1.概述

--- java.util接口 Map<K,V>
--- Map接口里的数据非常有特点,map里的数据都是一组 键值对.
--- 例如:map.put(10,20); -- 其中10是键 , 20是值
										  -- 键不能重复,值可以
										  -- 如果key重复了,后面的会覆盖前面的
--- 一般使用泛型约束Map集合里的键值的 类型 ,,,Map<K,V>

2.特点

--- 可以根据键 提取对应的值
--- 键不允许重复,如果重复值会被覆盖
--- 存放的都是无序数据
--- 初始容量是16,默认的加载因子是0.75				

3.常用方法

--- void clear()											从此映射中移除所有映射关系(可选操作)。
--- boolean containsKey(Object key)		如果此映射包含指定键的映射关系,则返回 true。
--- boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
--- V get(Object key)		 						返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
--- boolean isEmpty()								如果此映射未包含键-值映射关系,则返回 true。
--- V put(K key, V value)							 将指定的值与此映射中的指定键关联(可选操作)。
--- void putAll(Map<? extends K,? extends V> m)从指定映射中将所有映射关系复制到此映射中(可选操作)。
--- V remove(Object key)							如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
--- int size()												返回此映射中的键-值映射关系数。
--- Set<Map.Entry<K,V>> entrySet()		返回此映射所包含的映射关系的 Set 视图。

4.测试代码

 public static void main(String[] args) {
        // 1.创建对象
        Map<Integer,String> map = new HashMap<>();
        // 2.调用方法
        map.put(3, "孙悟空");
        map.put(4, "韩信");
        map.put(2, "赵云");
        map.put(1, "李白");

//        map.clear();              //清空集合 {}
        System.out.println(map);    //{1=李白, 2=赵云, 3=孙悟空, 4=韩信}
        System.out.println(map.containsKey(3));//判断是否包含key---true
        System.out.println(map.containsValue("韩信"));//判断是否包含value---true
        System.out.println(map.size());//获取元素个数---4
        System.out.println(map.isEmpty());//判断是否为空---false
        System.out.println(map.get(1));//根据key获取value---李白
        System.out.println(map.hashCode());//获取哈希码值---26490015
        System.out.println(map.equals(123));//判断是否和 对象123 相等---false
        System.out.println(map.remove(1));//根据key删除记录---李白

        Map<Integer,String> map2 = new HashMap<>();
        map2.putAll(map);
        System.out.println(map2);//{2=赵云, 3=孙悟空, 4=韩信}

	       //TODO 迭代map里的数据三种方法
	//方式1::: Set<K> keySet() --把map里的key存入set集合
	        Set<Integer> set = map.keySet();
	        //遍历set,获取每个key
	        for (Integer key : set) {
	            //拿着key回map里找value
	            System.out.println(key + "...foreach..." + map.get(key));
	//            2...foreach...赵云
	//            3...foreach...孙悟空
	//            4...foreach...韩信
	        }
	
	//方式2::: Set<Map.Entry<K,V>> entrySet()
	//  --把map里的key和value存到set里,并封装成Entry对象
	        Set<Map.Entry<Integer, String>> entry = map.entrySet();
	        //遍历set得到一个Entry
	        for (Map.Entry<Integer, String> mapEntry : entry) {
	            System.out.println(mapEntry.getKey() + "~~~ Map.Entry ~~~" + mapEntry.getValue());
	//            2~~~ Map.Entry ~~~赵云
	//            3~~~ Map.Entry ~~~孙悟空
	//            4~~~ Map.Entry ~~~韩信
	        }
	
	//方式3::: Collection<V> values() --把map里的value们存入Collection
	        Collection<String> values = map.values();
	        for (String value : values) {
	            //遍历集合,得到每个value
	            System.out.println(value + "/// Collection ///");
	//            赵云/// Collection ///
	//            孙悟空/// Collection ///
	//            韩信/// Collection ///
	        }
    }

HashMap

1.概述

--- HashMap是Map接口的实现类. 
--- 可以使用Map接口的所有方法.

2.原理

--- 底层是一个哈希表/散列表 
--- 把数据存在桶里
--- 由数组 和 链表组成的
--- 当往HashMap里存放数据时,,,,
		会根据hash算法(hashCode())计算数据的存储位置(hash(key))
		如果数组的位置没有数据,直接存在数组节点上.
		如果数组的位置存过数据了(hash冲突),会形成链表结构.
		jdk1.8对于链表结构的查询效率做了优化,当链表长度达到8时会变成红黑树来提升查询效率

3.测试代码

--- 需求:分析用户输入的字符串中  每个字符出现的次数
	public static void main(String[] args) {
	        // 1. 统计用户输入的字符串中, 每个字符出现的次数
	        String s = new Scanner(System.in).nextLine();
	
	        // 定义map,存结果,类似:a=1,b=2,c=1
	        Map<Character,Integer> map = new HashMap<>();
	        // 2.遍历字符串,获取每个字符
	        for (int i=0; i<s.length(); i++) {
	            //public char charAt(int index)返回指定索引处的char值,索引范围从0到length()-1.
	            char key = s.charAt(i);
	            //根据key获取value,
	            Integer value = map.get(key);
	
	            //判断,是null的话就没存过,直接存1
	            if (value == null) {
	                map.put(key, 1);
	            } else {
	                //判断,有值,不是null的话,就是以前存过,直接+1
	                map.put(key, value+1);
	            }
	        }
	        System.out.println(map);
	    }
	//TODO  原理:向map里存入数据时,会拿着key计算存储位置
 	//TODO  如果节点上没存过数据,就尽量存在数组节点上
	//TODO 如果节点存过数据了,再去判断key存过吗,存过就把原来的value覆盖掉
    //key不存在那就是一个新节点形成链表
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值