集合--双列(Map)集合

在这里插入图片描述

1 接口 Map<K,V>

Map类型集合每个元素值都包含两个对象:<键,值>。并且键在Map中不能有重复对象。
类型参数:
K - 此映射所维护的键的类型
V - 映射值的类型
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
特点:
(1)存储的是键值对(键,值)
(1)集合中键唯一
小技巧:在分析需求时,出现了对应关系。
(1) 如果对应关系中出现了有序的编号,可以使用数组。
(2)如果对应关系中没有有序的编号,就可以使用map集合

2 接口Map集合方法

//	需求:存储对应的中英文星期
	public static void main(String[] args) { 
		//	创建map集合(映射即Map,Map即映射)
		Map<String,String> map = new HashMap<String,String>();
		//	(1)添加元素put()
		/*	map集合如果键相同,值就会覆盖。并且put()方法返回
				以前与key对应的值,如果没有则返回 null。*/
		System.out.println(map.put("小美", "小明"));	//	null
		System.out.println(map.put("小美", "小黑"));	//	小明
		System.out.println(map.put("小美", "小方"));	//	小黑
		map.put("星期一", "Monday");
		map.put("星期天", "Sunday");
		//	(2)通过键获取value值。如果键不存在,返回null。
		System.out.println(map.get("星期天"));	//	Sunday
		//	(3)通过键获取value值并删除键值对。如果键不存在,返回null
		System.out.println(map.remove("星期一"));	//	Monday
		//	(4)打印Map集合toString()可省略
		System.out.println(map.toString());	//	{小美=小方, 星期天=Sunday}	
		//	(5)containsKey(Object key);判断是否存在该键
	}

3 接口Map集合的打印

Map集合中没有迭代器和增强for循环,先将Map集合(双列集合)转成单列集合,在用单列集合的迭代器去进行获取。

方法一:
(1)通过keySet()方法将Map集合的键用Set集合进行存储,使用Set集合的原因是键具有唯一性。
(2)对Set集合进行遍历获取所有的键,再通过键获取get(key)所有的值。
在这里插入图片描述

public static void main(String[] args) {
		//	创建Map集合,添加map元素
		Map<String,String> map = new HashMap<String,String>();
		map.put("星期一", "Monday");
		map.put("星期天", "Sunday");
		//	方法一:keySet()方法
		//	1.获取所有的键keySet(),存储在Set集合中
		Set<String> keyset = map.keySet();
		//	2.对Set集合进行遍历,先获取所有的键,在通过建获取所有的值
		//	对集合遍历有三种方法:(1)for循环(2)增强for循环(3)While循环
		//	(1) for循环
		for (Iterator<String> iterator = keyset.iterator(); iterator.hasNext();) {
			//	获取所有的键
			String key = iterator.next();
			//	获取所有的值get();
			String value = map.get(key);
			System.out.println(key+"----"+value);
		}
		//	(2)增强for循环
		for(String key:keyset){
			String value = map.get(key);
			System.out.println(key+ ">>>>" +value);
		}
		//	(3)while循环
		Iterator<String> it = keyset.iterator();
		while(it.hasNext()){
			String key = it.next();
			String value = map.get(key);
			System.out.println(key+ "对应的值:" +value);	
		}
	}

方法二:通过entry()方法获取映射关系对象Set(Map.Entry<String,String>),在分别通过getKey()方法和getValue()获取键和值。entry()方法获取的是映射关系,Map.Entry内部接口,相当于夫妻双方的结婚证。
在这里插入图片描述

public static void main(String[] args) {
		//	创建Map集合,并添加元素
		Map<String,String> map = new HashMap<String,String>();
		map.put("星期一", "Monday");
		map.put("星期天", "Sunday");
		//	方法二:entrySet()方法
		//	返回映射中包含的映射关系(相当于结婚证)
		Set<Map.Entry<String,String>> entryset = map.entrySet();
		//	遍历元素,获取Set集合中映射关系对象。通过映射对象分别获取键和值
		//	(1)for循环
		for(Iterator<Map.Entry<String,String>> iterator = 
				entryset.iterator();iterator.hasNext();){
			//返回的是Set集合中映射关系对象
			Map.Entry<String, String> me = iterator.next();
			//	获取键
			String key = me.getKey();
			//	获取值
			String value = me.getValue();
			System.out.println(key+":"+value);
		}
		//	(2)增强for循环
		for(Map.Entry<String, String> me : entryset){
			//	获取键
			String key = me.getKey();
			//	获取值
			String value = me.getValue();
			System.out.println(key+">>>>"+value);
		}
		//	(3)While循环
		Iterator<Map.Entry<String, String>> it = entryset.iterator();
		while(it.hasNext()){
			Map.Entry<String, String> me = it.next();
			String key = me.getKey();
			String value = me.getValue();
			System.out.println(key+"----"+value);
		}
	}

拓展:values()方法
获取所有的值,因为值不需要保证唯一性,所以接收值的返回值类型是Collection。

public static void main(String[] args) {
		//	创建Map集合,并添加元素
			Map<String,String> map = new HashMap<String,String>();
			map.put("星期一", "Monday");
			map.put("星期天", "Sunday");
			//	获取所有的值
			Collection<String> values = map.values();
			//	使用高级for循环进行遍历
			for(String value : values){
				System.out.println("value="+value);
			}
	}

4 Map的实现类
HashTable:哈希表,不保证迭代的顺序。任何非 null 对象都可以用作键或值。同步。
HashMap:哈希表,不同步。允许使用null作为键或者值。
TreeMap:二叉树,不同步。可以对map集合中的键进行排序。

4.1 HashMap的应用

public static void main(String[] args) {
		Map<Student,String> map = new HashMap<Student,String>();
		//存储元素
		map.put(new Student("小美",28), "长沙");
		//	同姓名,同年龄视为同一个人。即"小哥"只输出一个
	//	解决方法:HashMap底层是哈希表。重写hashcode()和equals()方法
		map.put(new Student("小哥",25), "广州");
		map.put(new Student("小哥",25), "内蒙古");
		//取出元素
		Set<Map.Entry<Student,String>> entryset = map.entrySet();
		//遍历Set集合
		for(Entry<Student, String> me : entryset ){
			Student key = me.getKey();
			String value = me.getValue();
			System.out.println(key+">>>>>>>>>>>"+value);
		}
	}

4.2 TreeMap集合的应用

public class TreeMapDemo05 {
	/*需求:学生对象(姓名,年龄)都有自己的归属地,既然有对应关系,就可
		将学生对象和归属地存储到map集合中。注意:同姓名和同年龄视为重复键
	(1)按照学生的年龄从小到大排序,实现自然排序。使用实现comparable的方法
	(2)按照学生姓名进行排序,使用比较器
	*/
	public static void main(String[] args) {
		//	比较器:ComparatorByName n = new ComparatorByName()
		Map<Student,String> map = new 
						TreeMap<Student,String>(new ComparatorByName());
		map.put(new Student("lisi",28),"长沙");
		map.put(new Student("amo",40),"北京");
		map.put(new Student("ranran",20),"武汉");
		//取出元素
		Set<Map.Entry<Student,String>> entryset = map.entrySet();
		//遍历Set集合
		for(Entry<Student, String> me : entryset ){
			Student key = me.getKey();
			String value = me.getValue();
			System.out.println(key+">>>>>>>>>>>"+value);
		}
	}
}
class ComparatorByName implements Comparator<Student>{
	@Override
	public int compare(Student stu1, Student stu2) {
		int temp = stu1.getName().compareTo(stu2.getName());
		return temp == 0?stu1.getAge() - stu2.getAge():temp;
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值