Map接口

        咱们都知道Collection、Set、List接口都属于单值的操做,即:每次只能操做一个对象,而今天介绍的Map与它们不一样的是,每次操做的是一对对象,即二元偶对象,Map中的每一个元素都使用key -- value的形式存储在集合之中,此接口定义以下: public interface Map<K,V>java

     (一)  先来看看Map接口中都有哪些经常使用的方法:缓存

No.安全

方法或类异步

类型性能

描述spa

1线程

public void clear()code

普通对象

清空Map集合blog

2

public boolean containsKey(Object key)

普通

判断指定的key是否存在

3

public boolean containsValue(Object value)

普通

判断指定的value是否存在

4

public Set<Map.Entry<K,V>> entrySet()

普通

Map对象变为Set集合

5

public boolean equals(Object o)

普通

对象比较

6

public V get(Object key)

普通

根据key取得value

7

public int hashCode()

普通

返回哈希码

8

public boolean isEmpty()

普通

判断集合是否为空

9

public Set<K> keySet()

普通

取得全部的key

10

public V put(K key, V value)

普通

向集合中加入元素

11

public void putAll(Map<? extends K,? extends V> t)

普通

将一个Map集合中的内容加入到另外一个Map

12

public V remove(Object key)

普通

根据key删除value

13

public int size()

普通

取出集合的长度

14

public Collection<V> values()

普通

取出所有的value

提出几个问题:

1.为何取出所有的value是Collection形式,而取出来key是Set?

2.返回哈希码有什么做用?

3.取出集合的长度用size而不是length?

(二)介绍经常使用的接口

      1. Map.Entry接口

          Map.Entry是Map中内部定义的一个接口,专门用来保存keyvalue的内容。

          Map.Entry接口定义: public static interface Map.Entry<K,V>

        Map.Entry接口的经常使用方法

No.

方法或类

类型

描述

1

public boolean equals(Object o)

普通

对象比较

2

public K getKey()

普通

取得key

3

public V getValue()

普通

取得value

4

public int hashCode()

普通

返回哈希码

5

public V setValue(V value)

普通

设置value的值

 注意思考为何没有setKey的方法呢?

Map与Map.Entry

2.Map接口的经常使用子类

       Map接口的经常使用子类:

       HashMap:无序存放的,是新的操做类,key不容许重复。

       Hashtable:无序存放的,是旧的操做类,key不容许重复。

       TreeMap:能够排序的Map集合,按集合中的key排序,key不容许重复。

       WeakHashMap:弱引用的Map集合,当集合中的某些内容再也不使用时,能够清除掉无用的数据,可使用gc进行回收。

       IdentityHashMap:key能够重复的Map集合。

   2. 着重介绍新的子类:HashMap 

   HashMap自己是Map的子类,直接使用此类为Map接口实例化便可。 HashMap类的定义以下: public class HashMap<K,V>extends         AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable

 实例操做一:向集合中增长和取出内容 

import java.util.HashMap;
import java.util.Map;
public class HashMapDemo01 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 声明Map对象,
		map = new HashMap<String, String>();	// key和value是String类
		map.put("first", "cool");			 // 增长内容
		map.put("second", "low");	         // 增长内容
		map.put("third", "none");	         // 增长内容
		String val = map.get("first");	     // 根据key求出value
		System.out.println("取出的内容是:" + val);	// 输出Map,调用toString()
	}
}

实例操做二:判断指定的key或value是否存在

import java.util.HashMap;
import java.util.Map;
public class HashMapDemo02 {
	public static void main(String[] args) {
		Map<String, String> map = null;			// 声明Map对象,
		map = new HashMap<String, String>();	// key和value是String类
		map.put("first", "cool");			// 增长内容
		map.put("second", "low");	// 增长内容
		map.put("third", "none");	// 增长内容
		if (map.containsKey("first")) {		// 查找指定的key是否存在
			System.out.println("搜索的key存在!");
		} else {
			System.out.println("搜索的key不存在!");
		}
		if(map.containsValue("cool")){	// 查找指定的value是否存在
			System.out.println("搜索的value存在!");
		}else{
			System.out.println("搜索的value不存在!");
		}
	}
}

实例操做三:输出所有的key

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapDemo03 {
	public static void main(String[] args) {
		Map<String, String> map = null;		    // 声明Map对象,
		map = new HashMap<String, String>();	// key和value是String类  
		map.put("first", "cool");		// 增长内容
		map.put("second", "low");	// 增长内容
		map.put("third", "none");	// 增长内容
		Set<String> keys = map.keySet();			// 获得所有的key
		Iterator<String> iter = keys.iterator();		// 实例化Iterator
		System.out.print("所有的key:");			// 输出信息
		while (iter.hasNext()) {				// 迭代输出所有的key
			String str = iter.next();			// 取出集合的key
			System.out.print(str + "、");		// 输出内容
		}
	}
}

实例操做四:输出所有的value

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapDemo04 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 声明Map对象,
		map = new HashMap<String, String>();	// key和value是String类
		map.put("first", "cool");			// 增长内容
		map.put("second", "low");	// 增长内容
		map.put("third", "none");	// 增长内容
		Collection<String> values = map.values();		// 获得所有的value
		Iterator<String> iter = values.iterator();		// 实例化Iterator
		System.out.print("所有的value:");			// 输出信息
		while (iter.hasNext()) {				// 迭代输出
			String str = iter.next();			// 取出value
			System.out.print(str + "、");		// 输出内容
		}
	}
}

3.旧的子类:Hashtable

public class HashtableDemo01 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 声明Map对象,
		map = new Hashtable<String, String>();		// key和value是String类
		map.put("first", "cool");		// 增长内容
		map.put("second", "low");	// 增长内容
		map.put("third", "none");	// 增长内容
		Set<String> keys = map.keySet();		// 获得所有的key
		Iterator<String> iter1 = keys.iterator();	// 实例化Iterator
		System.out.print("所有的key:");		// 输出信息
		while (iter1.hasNext()) {			// 迭代输出所有的key
			String str = iter1.next();		// 取出内容
			System.out.print(str + "、");		// 输出内容
		}
		Collection<String> values = map.values();	// 获得所有的value
		Iterator<String> iter2 = values.iterator();	// 实例化Iterator
		System.out.print("\n所有的value:");		// 输出信息
		while (iter2.hasNext()) {			// 迭代输出所有的value
			String str = iter2.next();		// 取出内容
			System.out.print(str + "、");		// 输出内容
		}
	}
}

HashMap与Hashtable的区别

No.

比较点

HashMap

Hashtable

1

推出时间

JDK 1.2以后推出的,属于新的操做类

JDK 1.0时推出,属于旧的操做类

2

性能

采用异步处理方式,性能更高

采用同步处理方式,性能较低

3

线程安全

属于非线程安全的操做类

属于线程安全的操做类

4

设置空值

容许设置null

不能设置null,若是设置则出现NullPointerException异常

4.排序的子类:TreeMap 

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapDemo01 {
	public static void main(String[] args) {
		Map<String, String> map = null;
		map = new TreeMap<String, String>();		// 实例化Map对象
		map.put("A、first", "cool");			// 增长内容
		map.put("C、second", "low");// 增长内容
		map.put("B、third", "none");		// 增长内容
		Set<String> keys = map.keySet();			// 获得所有的key
		Iterator<String> iter = keys.iterator();		// 实例化Iterator
		while (iter.hasNext()) {				// 迭代输出
			String str = iter.next();			// 取出key
			System.out.println(str + " --> " + map.get(str));	// 取出key对应的内容
		}
	}
}

5.弱引用类:WeakHashMap

      以前所讲解的Map 子类中的数据都是使用强引用保存的,即:里面的内容不论是否使用都始终在集合中保留,若是但愿集合能够自动清理暂时不用的数据就可使用WeakHashMap类。 WeakHashMap的定义以下: public class WeakHashMap<K,V>extends AbstractMap<K,V>implements Map<K,V>

import java.util.Map;
import java.util.WeakHashMap;
public class WeakHashMapDemo01 {
	public static void main(String[] args) {
		Map<String, String> map = null;
		map = new WeakHashMap<String, String>();	// 实例化Map对象
		map.put(new String("A"), new String("first"));
		map.put(new String("B"), new String("second"));
		map.put(new String("C"), new String("third"));	
		System.gc();				// 进行垃圾收集
		map.put(new String("D"), new String("fourth")) ;
		System.out.println("内容:" + map);		// 通常只会剩下一个内容  <D,fourth>
	}
}

提示:对象的引用强度说明

       从JDK1.2版本开始,Java把对象的引用分为四种级别,从而使程式能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

      下面来简单了解如下这四种引用的区别:

       强引用:当内存不足时,JVM宁肯出现OutOfMemeryError错误而使程序中止,也不会回收此对象来释放空间;

       软引用:当内存不足时,会回收这些对象的内存,用来实现内存敏感的高速缓存;

       弱引用:不管内存是否紧张,被垃圾回收器发现当即回收;

       虚引用:和没有任何引用同样。

6.Map接口输出:

       对于Map接口来讲,其自己是不能直接使用迭代(例如:Iterator、foreach)进行输出的,由于Map中的每一个位置存放的是一对值(key---->value),而Iterator中每次只能找到一个值。因此,若是此时非要使用迭代进行输出的话,则必须按照如下的步骤完成(以Iterator输出方法为例):

一、将Map的实例经过entrySet()方法变为Set接口对象;

二、经过Set接口实例为Iterator实例化;

三、经过Iterator迭代输出,每一个内容都是Map.Entry的对象;

四、经过Map.Entry进行key---->value的分离。

Map输出方式一:Iterator输出Map

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class IteratorDemo04 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 声明Map对象,指定泛型类型
		map = new HashMap<String, String>();		// 实例化Map对象
		map.put("first", "cool");						// 增长内容
		map.put("second", "low");	// 增长内容
		map.put("third", "none");		// 增长内容
		Set<Map.Entry<String, String>> allSet = null;	// 声明一个Set集合,指定泛型
		allSet = map.entrySet(); 			// 将Map接口实例变为Set接口实例
		Iterator<Map.Entry<String, String>> iter = null;	// 声明Iterator对象
		iter = allSet.iterator();			// 实例化Iterator对象
		while (iter.hasNext()) {
			Map.Entry<String,String> me = iter.next();// 找到Map.Entry实例
			System.out.println(me.getKey() 
					+ " --> " + me.getValue());	// 输出key和value
		}
	}
}

Map输出方式二:foreach输出Map

import java.util.HashMap;
import java.util.Map;
public class ForeachDemo02 {
	public static void main(String[] args) {
		Map<String, String> map = null;		// 声明Map对象,指定泛型类型
		map = new HashMap<String, String>();	// 实例化Map对象
		map.put("first", "cool");		// 增长内容
		map.put("second", "low");	// 增长内容
		map.put("third", "none");		// 增长内容
		for (Map.Entry<String, String> me : map.entrySet()) {// 输出Set集合
			System.out.println(me.getKey() 
					+ " --> " + me.getValue());// 输出key和value
		}
	}
}

注意事项二:直接使用非系统类做为key

       若是要使用非系统类做为Map的key,则此类必须覆写Object类中的如下两个方法: hashCode() equals

相关文章
相关标签/搜索