13.7 Map 接口(血干JAVA系列)

13.7.1 Map接口简介

在这里插入图片描述
在这里插入图片描述

13.7.2 Map.Entry接口简介

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

13.7.3 Map接口的常用子类

在这里插入图片描述

1.新的子类:HashMap

在这里插入图片描述
在这里插入图片描述

2.相关操作实例

(1)实例操作1——向集合中增加和取出内容

在Map接口中使用put(Object key,Object value)方法可以向集合中增加内容,然后可以通过get(E key)方法根据key找出其对应的value。

【例13.26】增加和取得内容
package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		System.out.println(map.get("s1"));
		System.out.println(map.get("s2"));
		System.out.println(map.get("s3"));
		System.out.println(map.get("s4"));
	}
}

(2)实例操作2------------ 判断指定的key或value是否存在

【例13.27】判断指定内容是否存在

如 果 要 判 断 某 一 个 指 定 的 k e y 或 v a l u e 是 否 存 在 , 可 以 使 用 M a p 接 口 中 提 供 的 containsKey(Object key)和 containsValue(Object value)两个方法,前者是判断 Map 集合是否存在指定的key,后者是判断Map集合是否存在指定的value。

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		System.out.println("是否包含key:s1】"+map.containsKey("s1"));
		System.out.println("是否包含value:s1_value】"+map.containsValue("s1_value"));
	}
}

(3)实例操作3——输出全部的key

【例13.28】输出全部的key

在 M a p 中 提 供 了 一 个 叫 做 k e y S e t ( ) 的 方 法 , 可 以 将 一 个 M a p 中 的 全 部 k e y 变 为 一 个 S e t 集合,一旦有了 Se t 实例,就可以直接使用I t e r a t o r接口输出。但是在进行操作的时候一定要注意的是,接收的Set集合里指定的泛型要和Map中key的泛型类型保持一致。

Set<String> allSet = map.keySet();
package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		Set<String> allSet = map.keySet();
		
		Iterator<String> iter = allSet.iterator();
		while(iter.hasNext()) {
			String str = iter.next();
			System.out.println(str);
		}
	}
}

(4)实例操作4——输出全部的value

【例13.29】输出全部的value

如果要输出全部的value,则使用values()方法,但是此方法的返回类型是Collectiono在进行操作的时候同样也需要注意泛型的类型。

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		Collection<String> allSet = map.values();
		Iterator<String> iter = allSet.iterator();
		while(iter.hasNext()) {
			String str = iter.next();
			System.out.println(str);
		}
	}
}

3.旧的子类:Hashtable

Hashtable也是Map中的一个子类,与Vector类的推出时间是一样的,都是属于旧的操作类, 其使用上也和之前没有太大的区别。

【例 13.30】 Hashtable 操作

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> map = new Hashtable<String,String>();
		map.put("s1","s1_value");
		map.put("s2","s2_value");
		map.put("s3","s3_value");
		map.put("s4","s4_value");
		System.out.println("key");
		Set<String> allSet = map.keySet();
		Iterator<String> iter_key = allSet.iterator();
		while(iter_key.hasNext())
		{
			String str = iter_key.next();
			System.out.println(str);
		}
		
		
		Collection<String> allCollection = map.values();
		Iterator<String> iter = allCollection.iterator();
		System.out.println("value");
		while(iter.hasNext()) {
			String str = iter.next();
			System.out.println(str);
		}
	}
}

4. HashMap 与 Hashtable 的区别

在这里插入图片描述

5.排序的子类:TreeMap

之前的两个类在存放数据的时候并没有对其进行排序,细心的读者可以发现在前面输出全部key的时候是无序的,而TreeMap子类的主要功能是可以按key排序。

【例13.31】观察TreeMap排序

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> allMap = new TreeMap<String, String>();
		allMap.put("AAA", "AAA_value");
		allMap.put("DDD", "DDD_value");
		allMap.put("BBB", "BBB_value");
		allMap.put("CCC", "CCC_value");
		allMap.put("AAA", "AAA_value_fuben");
//		System.out.println(allMap);
		Set<String> allSet = allMap.keySet();
		Iterator<String> iter = allSet.iterator();
		while(iter.hasNext())
		{
			System.out.print(allMap.get(iter.next())+"\t");
		}
	}
}

在这里插入图片描述

13.7.4 Map接口的使用注意事项

1.注意事项1——不能直接使用迭代输出Map中的全部内容

在这里插入图片描述

(1) Map 输出方式 1: Iterator 输出 Map

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> allMap = new HashMap<String, String>();
		allMap.put("AAA", "AAA_value");
		allMap.put("DDD", "DDD_value");
		allMap.put("BBB", "BBB_value");
		allMap.put("CCC", "CCC_value");
		Set<Map.Entry<String, String>> allSet = allMap.entrySet();
		Iterator<Map.Entry<String, String>> iter = allSet.iterator();
		while(iter.hasNext())
		{
			Map.Entry<String, String> e = iter.next();
			System.out.print(e.getKey()+"\t"+e.getValue()+"\n");
		}
	}
}

(2) Map输出方式2: foreach输出Map

在这里插入图片描述

package jiaqi;

import java.util.*;

public class temp {

	public static void main(String[] args) {
		Map<String, String> allMap = new HashMap<String, String>();
		allMap.put("AAA", "AAA_value");
		allMap.put("DDD", "DDD_value");
		allMap.put("BBB", "BBB_value");
		allMap.put("CCC", "CCC_value");
		Set<Map.Entry<String, String>> allSet = allMap.entrySet();
		for(Map.Entry<String, String> e:allSet)
		{
			System.out.print(e.getKey()+"\t"+e.getValue()+"\n");
		}
	}
}

2.注意事项2——直接使用非系统类作为key

【例 13.34】 String–>Person 映射

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<String, Person_> allMap = new HashMap<String,Person_>();
		allMap.put("zhangsan", new Person_("张三",20));
		System.out.println(allMap.get("zhangsan"));
	}
}

在这里插入图片描述

【例 13.35】 Person–>String 映射

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new HashMap<Person_,String>();
		allMap.put( new Person_("张三",20),"zhangsan");
		System.out.println(allMap.get(new Person_("张三",20)));
	}
}

在这里插入图片描述
在这里插入图片描述

【例13.36】声明Person对象–> String映射

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new HashMap<Person_,String>();
		Person_ per =  new Person_("张三",20);
		allMap.put(per,"zhangsan");
		System.out.println(allMap.get(per));
	}
}

在这里插入图片描述
在这里插入图片描述

【例13.37】覆写equals()和hashCode()方法

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if(this==obj)return true;
		if(!(obj instanceof Person_))return false;
		Person_ per = (Person_)obj;
		if(this.name.equals(per.name)&&this.age==per.age) return true;
		else return false;
	}
	public int hashCode() 
	{
		return this.name.hashCode()*this.age;
	}
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new HashMap<Person_,String>();
		allMap.put(new Person_("张三",20),"zhangsan");
		System.out.println(allMap.get(new Person_("张三",20)));
	}
}

在这里插入图片描述
在这里插入图片描述

13.7.5 key 可以重复的 Map 集合:IdentityHashMap

之前讲解的所有Map操作中key的值是不能重复的,例如,HashMap操作的时候key是不能重复的,如果重复肯定会覆盖之前的内容,如下面代码所示。

【例13.38】 Map中的key不允许重复,重复就是覆盖

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if(this==obj)return true;
		if(!(obj instanceof Person_))return false;
		Person_ per = (Person_)obj;
		if(this.name.equals(per.name)&&this.age==per.age) return true;
		else return false;
	}
	public int hashCode() 
	{
		return this.name.hashCode()*this.age;
	}
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new HashMap<Person_,String>();
		allMap.put(new Person_("张三",20),"zhangsan——1");
		allMap.put(new Person_("张三",20),"zhangsan——2");
		allMap.put(new Person_("李四",21),"李四");
		Set<Map.Entry<Person_, String>> allSet = allMap.entrySet();
		Iterator<Map.Entry<Person_, String>> iter = allSet.iterator();
		while(iter.hasNext())
		{
			Map.Entry<Person_,String> e = iter.next();
			System.out.println(e.getKey()+"\t"+e.getValue());
		}
		System.out.println();
	}
}

在这里插入图片描述
在这里插入图片描述

【例13.39】使用IdentityHashMap修改程序

package jiaqi;

import java.util.*;
class Person_
{
	private String name;
	private int age;
	public Person_(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if(this==obj)return true;
		if(!(obj instanceof Person_))return false;
		Person_ per = (Person_)obj;
		if(this.name.equals(per.name)&&this.age==per.age) return true;
		else return false;
	}
	public int hashCode() 
	{
		return this.name.hashCode()*this.age;
	}
	public String toString() 
	{
		return this.name+"的age是:"+this.age;
	}
}
public class temp {

	public static void main(String[] args) {
		Map<Person_,String> allMap = new IdentityHashMap<Person_,String>();
		allMap.put(new Person_("张三",20),"zhangsan——1");
		allMap.put(new Person_("张三",20),"zhangsan——2");
		allMap.put(new Person_("李四",21),"李四");
		Set<Map.Entry<Person_, String>> allSet = allMap.entrySet();
		Iterator<Map.Entry<Person_, String>> iter = allSet.iterator();
		while(iter.hasNext())
		{
			Map.Entry<Person_,String> e = iter.next();
			System.out.println(e.getKey()+"\t"+e.getValue());
		}
		System.out.println();
	}
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿斯卡码

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值