Map

本文深入讲解了Java中Map集合的概念及应用,包括HashMap、LinkedHashMap和TreeMap的特点与使用方式。探讨了不同Map集合如何存储键值对,以及键的唯一性和排序性的实现方法。

1.为什么学习Map集合:很多源码的底层用的是Map集合,有助力我们学习源码。

2.Map集合:存储Key-Value对,Key唯一的。

3.HashMap:存储Key-value对,Key唯一的。底层采用数组+链表结构存值。
Key的唯一性:通过hashCode()和equals()实现的。
注意:hashMap的键的数据类型一定要重新hashCode()和equals()才能键的唯一性。
在这里插入图片描述

eg:public static void main(String[] args) {
	//创建集合对象
	Map<String, String> hmap1=new HashMap<>();
	//向集合中添加元素
	hmap1.put("a", "aa");
	hmap1.put("c", "rr");
	hmap1.put("b", "ee");
	hmap1.put("k", "aa");
	hmap1.put("a", "kk");
	
	//将map集合中Key-value当作一个整体entry,将整个Map转换为Set集合
	Set<Entry<String, String>> set1= hmap1.entrySet();
	
	//获得集合的迭代器
	Iterator<Entry<String, String>> it1=set1.iterator();
	//遍历集合
	while (it1.hasNext()) {
		Entry<String, String> e1=it1.next();
		System.out.println("键为:"+e1.getKey()+",值为:"+e1.getValue());
	}
	
	System.out.println("-----------------------------------");
	//删除集合中元素
	hmap1.remove(44);
	
	//将map集合中所有的键存到set集合中
	Set<String> keySet=hmap1.keySet();
	//遍历键的集合
	for (String k : keySet) {
		//通过Map集合的Key获得值
		System.out.println("键为:"+k+",值为:"+hmap1.get(k));
	}
	
	System.out.println("*****************************");
	//清空集合
	hmap1.clear();
}

4.LinkedHashMap:存储Key-value对,key有序,唯一的。底层采用双重链接列表。

eg:public static void main(String[] args) {
	//创建集合对象
	Map<String, String> hmap1=new LinkedHashMap<>();
	//向集合中添加元素
	hmap1.put("a", "aa");
	hmap1.put("c", "rr");
	hmap1.put("b", "ee");
	hmap1.put("k", "aa");
	hmap1.put("a", "kk");
	
	//将map集合中Key-value当作一个整体entry,将整个Map转换为Set集合
	Set<Entry<String, String>> set1= hmap1.entrySet();
	
	//获得集合的迭代器
	Iterator<Entry<String, String>> it1=set1.iterator();
	//遍历集合
	while (it1.hasNext()) {
		Entry<String, String> e1=it1.next();
		System.out.println("键为:"+e1.getKey()+",值为:"+e1.getValue());
	}
	
	System.out.println("-----------------------------------");
	//删除集合中元素
	hmap1.remove("c");
	
	//将map集合中所有的键存到set集合中
	Set<String> keySet=hmap1.keySet();
	//遍历键的集合
	for (String k : keySet) {
		//通过Map集合的Key获得值
		System.out.println("键为:"+k+",值为:"+hmap1.get(k));
	}
	
	System.out.println("*****************************");
	//清空集合
	hmap1.clear();
}

5.TreeMap:存储key-value对,key无序,可排序,唯一的。底层采用二叉树。
Key的排序性:通过排序器实现,排序器的排序方法返回正数存在右边,返回负数存在左边。
key的唯一性:通过排序器返回0实现去重。
注意:TreeMap一定要用排序器,第一种TreeMap的Key的数据类型实现自然排序器,重写排序方法;
第二种声明一个自定义排序器类实现自定义排序器接口,重写排序方法,创建自定义排序 器类的对象,作为TreeMap构造方法的参数传递。
在这里插入图片描述

eg:案例一:Key用自然排序器
	/**
 * 学生类,实现自然排序器接口,重写排序方法
 * @author sx
 * @version 1.0 2019年7月3日
 */

public class Student2 implements Comparable<Student2>{
	public String sname;
	public Integer sage;

	public Student2() {
		
	}
	
	public Student2(String sname, Integer sage) {
		super();
		this.sname = sname;
		this.sage = sage;
	}

	/**
	 * 排序方法
	 * 排序规则:先按年龄从小到大,年龄相同再姓名的字典的降序
	 */
	@Override
	public int compareTo(Student2 o) {
		if (this.sage>o.sage) {
			return 1;
		}else if (this.sage<o.sage) {
			return -1;
		}else {//年龄相同
			if (this.sname.compareTo(o.sname)>0) {
				return -1;
			}else if (this.sname.compareTo(o.sname)<0) {
				return 1;
			}else {//年龄相同,姓名相同
				return 0;
			}
		}
	}
}

	   public static void main(String[] args) {
		//创建一个集合对象
		TreeMap<Student2, String> tmap1=new TreeMap<>();
		//向集合中添加元素
		tmap1.put(new Student2("c", 28), "程资源");
		tmap1.put(new Student2("j", 18), "蒋学志");
		tmap1.put(new Student2("y", 38), "杨旭");
		tmap1.put(new Student2("l", 48), "林俊杰");
		tmap1.put(new Student2("c", 28), "杨嗣森");
		
		//将map集合中key-value当作entry整合,将map集合集合转换为set集合
		Set<Entry<Student2, String>> set2=tmap1.entrySet();
		//获得集合的迭代器
		Iterator<Entry<Student2, String>> it2=set2.iterator();
		//遍历集合
		while (it2.hasNext()) {
			Entry<Student2, String> e2=it2.next();
			System.out.println("键的姓名属性为:"+e2.getKey().sname+",值为:"+e2.getValue());
		}
		
		System.out.println("-------------------------------");
		//删除集合中的元素
		tmap1.remove(new Student2("j", 18));
		//将map集合中所有键存入set集合
		Set<Student2> keySet2=tmap1.keySet();
		//遍历键的集合
		for (Student2 k : keySet2) {
			//根据Key获得value
			System.out.println("键的姓名属性为:"+k.sname+",值为:"+tmap1.get(k));
		}
		
		System.out.println("******************************");
		//清空集合
		tmap1.clear();
	}
	案例二:Key用自定义排序器
		/**
 * 自定义排序器类
 * @author sx
 * @version 1.0 2019年7月3日
 */
public class MyComparator3 implements Comparator<Student3>{
	/**
	 * 排序方法
	 * 排序规则:先按年龄从小到大
	 */
	@Override
	public int compare(Student3 o1, Student3 o2) {
		if (o1.sage>o2.sage) {
			return 1;
		}else if (o1.sage<o2.sage) {
			return -1;
		}else {
			return 0;
		}
	}
}

		public static void main(String[] args) {
		//创建一个集合对象,将自定义排序器类的对象作构造参数传入
		TreeMap<Student3, String> tmap1=new TreeMap<>(new MyComparator3());
		//向集合中添加元素
		tmap1.put(new Student3("c", 28), "程资源");
		tmap1.put(new Student3("j", 18), "蒋学志");
		tmap1.put(new Student3("y", 28), "杨旭");
		tmap1.put(new Student3("l", 48), "林俊杰");
		tmap1.put(new Student3("c", 3), "杨嗣森");
		
		//将map集合中key-value当作entry整合,将map集合集合转换为set集合
		Set<Entry<Student3, String>> set2=tmap1.entrySet();
		//获得集合的迭代器
		Iterator<Entry<Student3, String>> it2=set2.iterator();
		//遍历集合
		while (it2.hasNext()) {
			Entry<Student3, String> e2=it2.next();
			System.out.println("键的姓名属性为:"+e2.getKey().sname+",值为:"+e2.getValue());
		}
		
		System.out.println("-------------------------------");
		//删除集合中的元素
		tmap1.remove(new Student3("j", 18));
		//将map集合中所有键存入set集合
		Set<Student3> keySet2=tmap1.keySet();
		//遍历键的集合
		for (Student3 k : keySet2) {
			//根据Key获得value
			System.out.println("键的姓名属性为:"+k.sname+",值为:"+tmap1.get(k));
		}
		
		System.out.println("******************************");
		//清空集合
		tmap1.clear();
	}

案例三:Key用匿名内部类自定义排序器
	public static void main(String[] args) {
	//创建一个集合对象,将匿名内部类的自定义排序器类的对象作构造参数传入
	TreeMap<Student3, String> tmap1=new TreeMap<>(new Comparator<Student3>() {

		/**
		 * 排序方法
		 * 排序规则:先按姓名升序,姓名相同,按年龄降序
		 */
		@Override
		public int compare(Student3 o1, Student3 o2) {
			if (o1.sname.compareTo(o2.sname)>0) {
				return 1;
			}else if (o1.sname.compareTo(o2.sname)<0) {
				return -1;
			}else {//姓名相同
				if (o1.sage>o2.sage) {
					return -1;
				}else if (o1.sage<o2.sage) {
					return 1;
				}else {
					return 0;
				}
			}
		}
	});
	//向集合中添加元素
	tmap1.put(new Student3("c", 28), "程资源");
	tmap1.put(new Student3("j", 18), "蒋学志");
	tmap1.put(new Student3("y", 28), "杨旭");
	tmap1.put(new Student3("l", 48), "林俊杰");
	tmap1.put(new Student3("c", 3), "杨嗣森");
	
	//将map集合中key-value当作entry整合,将map集合集合转换为set集合
	Set<Entry<Student3, String>> set2=tmap1.entrySet();
	//获得集合的迭代器
	Iterator<Entry<Student3, String>> it2=set2.iterator();
	//遍历集合
	while (it2.hasNext()) {
		Entry<Student3, String> e2=it2.next();
		System.out.println("键的姓名属性为:"+e2.getKey().sname+"键的年龄属性为"+e2.getKey().sage+",值为:"+e2.getValue());
	}
	
	System.out.println("-------------------------------");
	//删除集合中的元素
	tmap1.remove(new Student3("j", 18));
	//将map集合中所有键存入set集合
	Set<Student3> keySet2=tmap1.keySet();
	//遍历键的集合
	for (Student3 k : keySet2) {
		//根据Key获得value
		System.out.println("键的姓名属性为:"+k.sname+",值为:"+tmap1.get(k));
	}
	
	System.out.println("******************************");
	//清空集合
	tmap1.clear();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值