1. 新的子类:HashMap
1.1 Map 相关基本概念
- 如果想要使用 Map 接口也必须依靠其子类实列化。Map 接口中的常用子类介绍如下:
(1) HashMap: 无序存放的,是新的操作类,key 不允许重复。
(2) Hashtable: 无序存放的,是旧的操作类,key 不允许重复。
(3) TreeMap: 可以排序的 Map 集合,按集合中的 key 排序, key 不允许重复。
(4) WeakHashMap: 若引用的 Map 集合,当集合中的某些内容不再使用时清除掉无用的数据,使用 gc (Garbage Collection)进行回收。
(5) IdentifyHashMap: key 可以重复的 Map 集合。
1.2 HashMap 相关操作实例
1. 向集合中增加和取出内容
在 Map 接口中可以通过 put(Object key,Object value) 方法向集合中增加内容,通过 get(E key) 方法根据 key 找出对应的 value。
实列1代码:
package self.learn.map;
import java.util.HashMap;
import java.util.Map;
public class LearnMapDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = null; // 声明 Map 对象
map = new HashMap<String, String>(); // key 和 value 是 String 类
map.put("1", "Java good-aa!"); // 增加内容
map.put("2", "Java good-bb!");
map.put("3", "Java good-cc!");
String val = map.get("1"); // 根据 key 求出对应 value
System.out.println("取出的内容为:"+ val); // 输出 Map,调用 toString()
}
}
2. 判断指定的 key 或 value 是否存在
如果要判断一个指定的 key 或 value 是否存在,可以使用 Map 接口中提供的 contains( Object key) 和 contains( Object value ) 两方法,前者是判断 Map 集合中是否是存在指定的 key, 后者是 Map 集合中是否存在指定的 value 。
实列2代码:
package self.learn.map;
import java.util.HashMap;
import java.util.Map;
public class LearnMapDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = null; // 声明 Map 对象
map = new HashMap<String, String>(); // key 和 value 是 String 类
map.put("1", "Java good-aa!"); // 增加内容
map.put("2", "Java good-bb!");
map.put("3", "Java good-cc!");
if(map.containsKey("1")) { // 查找指定的 key 是否存在
System.out.println("搜索的 key 存在!");
}else {
System.out.println("搜索的 key 不存在!");
}
if(map.containsValue("Java good-aa!")) { // 查找指定的 value 是否存在
System.out.println("搜索的 value 存在!");
}else {
System.out.println("搜索的 value 不存在!");
}
}
}
运行结果截图:
3. 输出全部的 key
在 Map 中提供了一个叫做 keySet() 的方法,可以将一个 Map 中的全部 key 变为一个 Set 集合,一旦有了 Set 实列,就可以直接使用 Iterator 接口输出。但是在进行操作的时候一定要注意的是,接收的 Set 集合里指定的泛型要和 May 中 key 里指定的泛型保持一致。
实列3代码:
package self.learn.map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class LearnMapDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = null; // 声明 Map 对象
map = new HashMap<String, String>(); // key 和 value 是 String 类
map.put("1", "Java good-aa!"); // 增加内容
map.put("2", "Java good-bb!");
map.put("3", "Java good-cc!");
Set<String> keySet = map.keySet(); // 得到全部的 key
Iterator<String> iter = keySet.iterator(); // 实列化 Iterator 对象
System.out.print("全部的 key:"); // 输出全部的 key
while(iter.hasNext()) { // 迭代输出全部的 key
String str = iter.next(); // 取出集合的 key
System.out.print(str+"、");
}
}
}
运行结果截图:
4. 输出全部的 value
如果需要输出全部的 value, 则使用 values() 方法,但是此方法的返回类型是 Collection 类型。在进行操作的时候同样要注意泛型的类型。
实列4代码:
package self.learn.map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class LearnMapDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = null; // 声明 Map 对象
map = new HashMap<String, String>(); // key 和 value 是 String 类
map.put("1", "Java good-aa!"); // 增加内容
map.put("2", "Java good-bb!");
map.put("3", "Java good-cc!");
Collection<String> values = map.values(); // 得到全部的 value
Iterator<String> iter = values.iterator(); // 实列化 Iterator 对象
System.out.print("全部的 value:"); // 输出全部的 value
while(iter.hasNext()) { // 迭代输出全部的 value
String str = iter.next(); // 取出集合的 value
System.out.print(str+"、");
}
}
}
运行结果截图:
2. 旧的子类:Hashtable
2.1 Map 相关基本概念
Hashtable 也是 Map 中的一个子类,与 Vector 类的推出时间是一样的,都是属于旧的操作类,其使用也和之前没太大区别。
2.2 Hashtable 相关操作实例
实列5代码:
package self.learn.map;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class LearnMapDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = null; // 声明 Map 对象
map = new Hashtable<String, String>(); // key 和 value 是 String 类
map.put("1", "Java good-aa!"); // 增加内容
map.put("2", "Java good-bb!");
map.put("3", "Java good-cc!");
Set<String> keys = map.keySet(); // 得到的全部的 key
Iterator<String> iter1 = keys.iterator(); // 实列化 Iterator
System.out.print("全部的 key:"); // 输出全部的 key
while(iter1.hasNext()) { // 迭代输出全部的 key
String str1 = iter1.next(); // 取出内容
System.out.print(str1+"、");
}
Collection<String> values = map.values(); // 得到全部的 value
Iterator<String> iter2 = values.iterator(); // 实列化 Iterator 对象
System.out.print("\n全部的 value:"); // 输出全部的 value
while(iter2.hasNext()) { // 迭代输出全部的 value
String str2 = iter2.next(); // 取出集合的 value
System.out.print(str2+"、");
}
}
}
运行结果截图:
3. HashMap 与 Hashtable 的区别
序号 | 比较点 | HashMap | Hashtable |
---|---|---|---|
1 | 推出时间 | JDK 1.2 之后推出的,属于新的操作类 | JDK 1.0 时推出的,属于旧的操作类 |
2 | 性能 | 采用异步处理方式,性能更高 | 采用同步处理方式,性能较低 |
3 | 线程安全 | 属于非线程安全的操作类 | 属于线程安全的操作类 |
4 | null 操作 | key 或 value 允许保存 null | key 或 value 不允许保存 null,否则会出现 NullPointException 异常 |
从实际开发来看, HashMap 类使用较多,重点掌握。
4. 排序的子类:TreeMap
之前两个子类在存放数据时候并没有进行排序,细心的读者可以发现在前面输出全部的 key 的时候是无序的,而 TreeMap 子类的主要功能是可以按 key 排序。
4.1 TreeMap 相关操作实例
实列6代码:
package self.learn.map;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class LearnMapDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Map<String, String> map = null; // 声明 Map 对象
map = new TreeMap<String, String>(); // key 和 value 是 String 类
map.put("A、mldn", "Java good-aa!"); // 增加内容
map.put("B、jixianint", "Java good-bb!");
map.put("C、mldnjava", "Java good-cc!");
Set<String> keys = map.keySet(); // 得到的全部的 key
Iterator<String> iter1 = keys.iterator(); // 实列化 Iterator
//System.out.print("全部的 key:"); // 输出全部的 key
while(iter1.hasNext()) { // 迭代输出全部的 key
String str1 = iter1.next(); // 取出内容
System.out.println(str1+" ---> "+map.get(str1)); // 取出key 对应的内容
}
}
}