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());
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【完整课程列表】 资源汇总下载地址:https://download.csdn.net/download/qq_27595745/55418618 Java SE编程入门教程 collection与collections(共7页).pptx Java SE编程入门教程 java GC(共6页).pptx Java SE编程入门教程 java instanceof(共3页).pptx Java SE编程入门教程 java IO(共28页).pptx Java SE编程入门教程 java Math(共11页).pptx Java SE编程入门教程 java object(共9页).pptx Java SE编程入门教程 java static final(共24页).pptx Java SE编程入门教程 java this和super(共10页).pptx Java SE编程入门教程 java 常用API(共22页).pptx Java SE编程入门教程 javaGUI编程快速入门(1)(共82页).pptx Java SE编程入门教程 java包装器(共9页).pptx Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程入门教程 java接口(共21页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java入门以及变量debug(共63页).pptx Java SE编程入门教程 java设计模式(共17页).pptx Java SE编程入门教程 java数组(共33页).pptx Java SE编程入门教程 java网络编程(共29页).pptx Java SE编程入门教程 java线程(共61页).pptx Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 String字符串(共27页).pptx Java 位运算.docx java正则表达式例子大全 共10页.doc JAVA正则表达式实例教程 共17页.docx JAVA正则表达式实例教程 共17页.pdf 递归算法.docx 堆和栈.wps

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值