Map集合(Key-Value键值对集合)

Map基本使用

通过一个特定的关键信息(键)去查询对应的值。使用List来实现存在效率非常低的问题,因为平均需要扫描一半的元素才能确定,而Map这种键值(key-value)映射表的数据结构,作用就是能高效通过key快速查找value(元素)
 

Map<K,V>是一种键-值 映射表,当我们调用put(Kkey,V value)方法时,就把key和value做了映射并放入Map。当我们调用Vget(Kkey)时,就可以通过key获取到对应的value。如果key不存在,则返回nul1。和List类似,Map也是一个接口,最常用的实现类是HashMap。如果只是想查询某个key是否存在,可以调用boolean containsKey(Kkey)方法。

重复放入key-va1ue并不会有任何问题,但是一个key只能关联一个value。put()方法的签名是Vput(Kkey,V value),如果放入的key已经存在,lput()方法会返回被删除的旧va1ue,否则,返回null。
Map中不存在重复的key,因为放入相同的key,只会把原有的key-value对应的va1ue给覆掉。
此外,在一个Map中,虽然key不能重复,但value是可以重复的:

 

Map和List不同的是,Map存储都的是key-value的映射关系,并且,它不保证顺序。在遍历的时候,遍历的顺序既不一定是put()时放入的key的顺序,也不一定是key的排序顺序。使用Map时,任何依赖顺序的逻辑都是不可靠的。以HashMap为例,假设我们放入"A","B","c"这3个key,遍历的时候,每个key会保证被遍历一次且仅遍历一次,但顺序完全没有保证,甚至不同的JDK版本,相同的代码遍历的输出顺序都是不同的。

package com.xn.ffri;

import java.util.HashMap;

public class Fri06 {
	public static void main(String[] args) {
		//HashMap
		//KV键值对集合,key唯一,value允许重复
		HashMap<String, Integer> cityMap=new HashMap<String, Integer>();
		//put()方法:添加键值对
		//如果key不存在,键返回null
		System.out.println(cityMap.put("X西安",11111));
		System.out.println(cityMap.put("C长沙",22222));
		System.out.println(cityMap.put("X厦门",33333));
		System.out.println(cityMap.put("W武汉",44444));
		//如果key存在,则保存新value,返回旧value
		System.out.println(cityMap.put("X西安",11112));
		//
		int value1=cityMap.get("C长沙");
		System.out.println("C长沙 ==>"+value1);
		
		Integer value3=cityMap.get("G贵阳");
		System.out.println("G贵阳 ==>"+value3);
		
		int value2=cityMap.get("G贵阳");
		System.out.println("G贵阳 ==>"+value2);
	}
}
package com.xn.ffri;

import java.lang.reflect.Array;
import java.text.CollationElementIterator;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;

public class Fri07 {
	public static void main(String[] args) {
		//歌手分类
		HashMap<String, String[]> map = new HashMap<String, String[]>();
		map.put("华语", new String[] { "林俊杰", "陈奕迅", "邓紫棋", "薛之谦", "汪苏泷", "李荣浩" });
		map.put("欧美", new String[] { "贾斯丁比伯", "威肯", "艾兰沃克", "德雷克" });
		map.put("乐队", new String[] { "魔力红", "烟鬼组合", "共和时代", "辅音组合", "Linkin Park", "Westlife" });
		//遍历Map
		//方式1:获取所有的key,然后按照每个key获取对应的key
		Set<String> keys = map.keySet();//获取map中所有的key

		System.out.println("所有的keys:" + keys);
		Iterator<String> it = keys.iterator();
		while (it.hasNext()) {
			String key = it.next();//获取每个key
			String[] val = map.get(key);//按照key获取对应的value
			System.out.printf("%s --> %s\n", key, Arrays.toString(val));
		}
		
		//方式2:
		//根据key,获取value(数组)
//		String[]array=map.get("乐队")月
//		for (String name array){
//		System.out.println(name);
//		}

		//获取所有的value
		//Set<String> keys = map.keySet();获取所有的key
		Collection<String[]> values=map.values();
		for(String[] arr:values) {
			System.out.println(Arrays.toString(arr));
		}
		
		//
		//方式3:将每个KV键值对按照Entry类型对象,统一获取
		Set<Entry<String,String[]>> entrys=map.entrySet();
		for(Entry<String,String[]> keyvalue:entrys) {
			System.out.printf("%s -- > %s\n",keyvalue.getKey(),Arrays.toString(keyvalue.getValue()));
		}
		//判断key是否存在
		boolean is=map.containsKey("日韩");
		//根据key获取value,如果key不存在。则返回default默认值
		String[] value=map.getOrDefault("日韩", new String[] {});
		//根据key删除KV键值对
		map.remove("欧美");
		//获取键值对的数量
		int size=map.size();
	}
}

小结
Map是一种映射表,可以通过key快速查找value;
可以通过for each遍历keySet(),也可以通过for each遍历entryset(),直接获
取key-value键值对;
最常用的一种Map实现是HashMap;(无序,key唯一)
HashMap的数据结构采用数组+链表+红黑树
HashMap的按照key的hash值计算数组中的存储位置下标,计算方式:(n-1)&hash。
如果在该下标位置已经存在元素,代表产生哈希冲突,则采用链地址法处理,以单向链表的形
式,将新元素存储在链表的尾部(尾插法)。
当链表中Node节点的数量大于8并且数组的长度大于64时,链表会转换成一个红黑树,有
利于查搜索。
HashMap的默认容量为16,加载因子为0.75f,当集合元素个数超过扩容阈值(容量*加
载因子)时,HashMap会将底层数组容量按照2倍进行扩容。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值