java SE基础(Map接口及其实现)

map接口的继承关系如下图所示

1。Map接口

    (1)Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容
    (2)某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。
    (3)将可变对象用作映射键时必须格外小心。如果以影响 equals 比较的方式更改了对象的值,则映射的行为将是不确定的
    (4)一个映射不能包含重复的键;每个键最多只能映射到一个值
    (5)嵌套接口Map.Entry<K,V>
        映射项(键-值对),Map.entrySet方法返回映射的collection视图。获得映射项引用的唯一方法是通过此 collection 视图的迭代器来实现

public static interface Map.Entry<K,V>{
	K getKey();						//返回与此项对应的键
	V getValue();					//返回与此项对应的值
	V setValue(V value);			//用指定的值替换与此项对应的值
}
    (6)部分方法
public interface Map<K,V>{
	int size();							//返回此映射中的键-值映射关系数
	boolean containsKey(Object key);	//如果此映射包含指定键的映射关系,则返回 true
	boolean containsValue(Obj value);	//如果此映射将一个或多个键映射到指定值,则返回 true
	V get(Object key);					//返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
	V put(K key, V value);				//将指定的值与此映射中的指定键关联
	V remove(Object key);				//如果存在一个键的映射关系,则将其从此映射中移除
	Collection<V> values();				//返回此映射中包含的值的 Collection 视图
	Set<K> keySet();					//返回此映射中包含的键的 Set 视图
	Set<Map.Entry<K,V>> entrySet();		//返回此映射中包含的映射关系的 Set 视图
}</span>

2。HashMap类

    (1)基于hash表,允许null值和null键,线程不同步
    (2)不保证映射的顺序恒久不变
    (3)部分方法

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>,Cloneable,Serializable{
	public HashMap(){}						//构造一个具有默认初始容量(16)和默认加载因子(0.75)的空HashMap
	public HashMap(int initialCapacity){}	//构造一个带指定初始容量和默认加载因子(0.75)的空HashMap
	public HashMap(int initialCapacity,float loadFactor){}		//构造一个带指定初始容量和加载因子的空HashMap
	public HashMap(Map<? extends K,? extends V> m){}			//构造一个映射关系与指定 Map 相同的新 HashMap
	
	public V put(K key,V value){}			//在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换
}                  
(4)例如

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MyHashMap {
	
	public static void main(String[] args) {
		HashMap<Integer	, String> hashmap = new HashMap<Integer , String>();				//创建哈希映射对象
		
		String[] str = {"zero" , "one" , "two" , "three" , "four" , "five" , "six" , "seven"};	//初始化对象
		for(int i  = 0 ; i < 8 ; i++)
			hashmap.put(i, str[i]);
		
		Set<Map.Entry<Integer, String>> set = hashmap.entrySet();							//获取键值对对象集合
		Iterator< Map.Entry<Integer, String>> iterator = set.iterator();					//获取集合的迭代器
		while(iterator.hasNext()){															//遍历集合,取出键值对
			Map.Entry<Integer , String> mapentry = iterator.next();
			System.out.print( "[ "+mapentry.getKey()+","+mapentry.getValue()+" ]\t" );
		}
		System.out.println();
		
		Set<Integer> keyset = hashmap.keySet();					//获取键的集合
		Iterator<Integer> keyiterator = keyset.iterator();		//获取键集合的迭代器
		while(keyiterator.hasNext()){							//遍历键集合,并通过键获取值
			Integer key = keyiterator.next();
			System.out.print( "[ "+key+","+hashmap.get(key)+" ]\t" );
		}
		System.out.println();
		
		System.out.println( hashmap.containsKey(2) );			//测试是否包含某个键或值
		System.out.println( hashmap.containsValue("two") );
		
		System.out.println( hashmap.size() ); 					//获取键值对数目
		
		System.out.println( hashmap.remove(2) );				//根据键移除键值对
		System.out.println( hashmap.put(null, null) );
		System.out.println( hashmap.put(null, "name") );
		System.out.println( hashmap.size() );  					//获取键值对数目
		
		System.out.println( hashmap.containsKey(2) );			//测试是否包含某个键或值
		System.out.println( hashmap.containsValue("two") );
		
		Collection<String> valuecollection = hashmap.values();	//获取值得集合
		Iterator<String> valueiterator = valuecollection.iterator();				//获取迭代器
		while(valueiterator.hasNext())
			System.out.print( valueiterator.next()+"\t" );
		System.out.println();
	}
}

3。SortedMap接口

    (1)进一步提供关于键的总体排序的Map。根据其键的自然顺序进行排序的,或者根据创建有序映射时提供的Comparator进行排序
    (2)插入有序映射的所有键都必须实现Comparable接口,所有这些键都必须是可互相比较的
    (3)部分方法

public interface SortedMap<K,V> extends Map<K,V>{
	Comparator<? super K> comparator();			//返回对此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回 null
	Set<Map.Entry<K,V>> entrySet();				//返回在此映射中包含的映射关系的 Set 视图
	SortedMap<K,V> subMap(K fromKey, K toKey);	//返回此映射的部分视图,其键值的范围从 fromKey(包括)到 toKey(不包括
}

4。TreeMap类

    (1)基于红黑树、键不能null、线程不同步
    (2)此实现为 containsKey、get、put 和 remove 操作提供受保证的 log(n) 时间开销
    (3)部分方法

public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable{
	TreeMap(){}									//使用键的自然顺序构造一个新的、空的树映射
	TreeMap(Comparator<? super K> comparator){}	//构造一个新的、空的树映射,该映射根据给定比较器进行排序
	
	Collection<V> values(){}					//返回此映射包含的值的 Collection 视图
	Set<K> keySet(){}							//返回此映射包含的键的 Set 视图
	Set<Map.Entry<K,V>> entrySet(){}			//返回此映射中包含的映射关系的 Set 视图
	
	NavigableMap<K,V> descendingMap(){}			//返回此映射中所包含映射关系的逆序视图
	
	Comparator<? super K> comparator(){}		//返回对此映射中的键进行排序的比较器;如果此映射使用键的自然顺序,则返回 nul
}
    (4)例如
import java.util.Comparator;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
import java.util.Iterator;
import java.util.Set;

public class TreeMapCom implements Comparator<Person>{
	public static void main(String[] args) {
		TreeMap<Person,String> treemap = new TreeMap<Person,String>(new TreeMapCom());	//创建树映射对象
		
		String[] str = {"zero","one","two","three","four","five"};						//初始化
		Random rnum = new Random();
		Random rage = new Random();
		int i = 0;
		while( i < str.length){
			Person person = new Person(rnum.nextInt(30), rage.nextInt(20));
			if(!treemap.containsKey(person)){
				treemap.put(person, str[i]);
				i++;
			}
		}
		
		Set<Map.Entry<Person, String>> entry = treemap.entrySet();						//获取键值对集合
		Iterator<Map.Entry<Person, String>> iterator = entry.iterator();				//获取迭代器
		while(iterator.hasNext()){														//遍历
			Map.Entry<Person, String> temp = iterator.next();
			System.out.print( "[ "+temp.getKey().toString()+","+temp.getValue()+" ]\t" );
		}
		System.out.println();
	}
	
/*	@Override
	public int compare(Person arg0, Person arg1) {
		return arg0.getAge() - arg1.getAge();
	}*/
	@Override
	public int compare(Person arg0, Person arg1) {
		return arg0.getNumber() - arg1.getNumber();
	}
}				

5。Hashtable类

    (1)基于哈希表、键和值均不能null、线程同步
    (2)部分方法

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable{
	Hashtable(){}											//用默认的初始容量 (11) 和加载因子 (0.75) 构造一个新的空哈希表
	Hashtable(int initialCapacity, float loadFactor){}		//用指定初始容量和指定加载因子构造一个新的空哈希表
	
	Set<Map.Entry<K,V>> entrySet(){}						//返回此映射中包含的键的 Set 视图
	Set<K> keySet(){}										//返回此映射中包含的键的 Set 视图
	Collection<V> values(){}								//返回此映射中包含的键的 Collection视图
	
	V put(K key, V value){}									//将指定 key 映射到此哈希表中的指定 value
	protected  void rehash(){}								//增加此哈希表的容量并在内部对其进行重组,以便更有效地容纳和访问其元素
}   
    (3)例如
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;

public class MyHashtable {
	public static void main(String[] args) {
		Hashtable<Integer , Integer> hashtable = new Hashtable<Integer, Integer>();								//创建hashtable对象
		
		Random rkey = new Random();						//利用随机数进行初始化
		Random rvalue = new Random();
		int key , value , count = 0 ;
		while( count < 8 ){
			key = rkey.nextInt(20);
			value = rvalue.nextInt(30);
			
			if(!hashtable.containsKey(key)){
				hashtable.put(key, value);
				count++;
			}
		}
		
		Set< Map.Entry<Integer, Integer> > set = hashtable.entrySet();											//遍历hashtable
		Iterator< Map.Entry<Integer, Integer> > iterator = set.iterator();
		while(iterator.hasNext()){
			Map.Entry<Integer, Integer> entry = iterator.next();
			System.out.print( "[ "+entry.getKey()+","+entry.getValue()+" ]\t" );
		}
		System.out.println();
		System.out.println(hashtable.toString());
		System.out.println(hashtable.hashCode());
	}
}

你可能感兴趣的:(java,HashMap,map,TreeMap,Hashtable)