这里写目录标题
- 13.7.1 Map接口简介
- 13.7.2 Map.Entry接口简介
- 13.7.3 Map接口的常用子类
- 1.新的子类:HashMap
- 2.相关操作实例
- (1)实例操作1——向集合中增加和取出内容
- 【例13.26】增加和取得内容
- (2)实例操作2------------ 判断指定的key或value是否存在
- 【例13.27】判断指定内容是否存在
- (3)实例操作3——输出全部的key
- 【例13.28】输出全部的key
- (4)实例操作4——输出全部的value
- 【例13.29】输出全部的value
- 3.旧的子类:Hashtable
- 【例 13.30】 Hashtable 操作
- 4. HashMap 与 Hashtable 的区别
- 5.排序的子类:TreeMap
- 【例13.31】观察TreeMap排序
- 13.7.4 Map接口的使用注意事项
- 1.注意事项1——不能直接使用迭代输出Map中的全部内容
- (1) Map 输出方式 1: Iterator 输出 Map
- (2) Map输出方式2: foreach输出Map
- 2.注意事项2——直接使用非系统类作为key
- 【例 13.34】 String-->Person 映射
- 【例 13.35】 Person-->String 映射
- 【例13.36】声明Person对象--> String映射
- 【例13.37】覆写equals()和hashCode()方法
- 13.7.5 key 可以重复的 Map 集合:IdentityHashMap
- 【例13.38】 Map中的key不允许重复,重复就是覆盖
- 【例13.39】使用IdentityHashMap修改程序
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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic 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();}
}