Map接口
Map接口特点:
实现Map接口的类用来存储 键--值 对。
Map接口的实现类由hashMap和TreeMap等。
Map类中存储的 键 - 值 对通过键来标识,所以键值不能重复。
一个映射不能包含重复的键;每个键最多只能映射到一个值。键最多只包含一个null,而值可以有多个null。
映射使用两个关键字 get( )和put( ):
使用
put( )
方法可以将一个指定关键字和值加入映射。为了得到值,可以通过将关键字作为参数来调用
get( )
方法,调用返回该值
。
对象在Map中的存储位置:
键决定了对象在映射中的存储位置,
但并不是键本身决定的,需要通过一种
散列(哈希)技术
进行处理,从而产生一个被称作
散列(哈希)码
的整数值,散列码通常用作一个 偏置量,该偏置量是相对于分配给映射的内存区域的起始位置的,由此来确定存储对象在映射中的存储位置。
无序映射:
与放入
Map
中的次序无关。
Map接口提供三种collection
视图:
允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。允许以三种方法将映射视作集合,这三种方法就是:keySet、values 和entrySet,
keySet是映射中包含的键集:
Set keys=map.keySet()
values是映射中的值的集合:
Collections values=map.values();
entrySet是包含在映射中的键-值对的集:
Set kvs=map.entrySet();
//kvs内容为Map.Entry的集合
Map接口中常用的方法:
int size()
- 返回此映射中的键-值映射关系数。
boolean isEmpty()
- 如果此映射未包含键-值映射关系,则返回 true。
boolean containsKey(Object key)
- 如果此映射包含指定键的映射关系,则返回 true。更确切地讲,当且仅当此映射包含针对满足 (key==null ? k==null : key.equals(k)) 的键 k 的映射关系时,返回 true。(最多只能有一个这样的映射关系)。
boolean containsValue(Object value)
- 如果此映射将一个或多个键映射到指定值,则返回 true。更确切地讲,当且仅当此映射至少包含一个对满足 (value==null ? v==null : value.equals(v)) 的值 v 的映射关系时,返回 true。对于大多数 Map 接口的实现而言,此操作需要的时间可能与映射大小呈线性关系。
get(Object key)
-
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回
null
。
- 将指定的值与此映射中的指定键关联(可选操作)。如果此映射以前包含一个该键的映射关系,则用指定值替换旧值
remove(Object key)
- 如果存在一个键的映射关系,则将其从此映射中移除
void clear()
- 从此映射中移除所有映射关系(可选操作)。此调用返回后,该映射将为空。
Set<K> keySet()
-
返回此映射中包含的键的
Set
视图。
Collection<V> values()
-
返回此映射中包含的值的
Collection
视图
Set<Map.Entry<K,V>> entrySet()
-
返回此映射中包含的映射关系的
Set
视图。
boolean equals(Object o)
- 比较指定的对象与此映射是否相等
int hashCode()
- 返回此映射的哈希码值。
HashMap类
基于哈希表的Map接口的实现,
如果经常需要添加、删除和定位映射关系,建议利用HashMap类实现Map集合,不过在遍历集合时,得到的映射关系是无序的。
在使用由HashMap类实现的Map集合时,需要重写作为主键对象类的hashCode()方法,在重写hashCode()方法时,有以下两条基本原则:
(1)不唯一原则:不必为每个对象生成一个唯一的哈希码,只要通过hashCode方法生成的哈希码能够利用get()方法得到利用put()方法添加的映射关系就可以。
(2)分散原则:生成哈希码的算法应尽量使哈希码的值分散一些,不要很多哈希码值都集中在一个范围内,这样有利于提高由HashMap类实现的Map集合的性能。
方法:
public int size()
- 返回此映射中的键-值映射关系数。
public boolean isEmpty()
- 如果此映射不包含键-值映射关系,则返回 true。
public V get(Object key)
-
返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回
null
。
public V put(K key, V value)
- 在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换。
public void putAll(Map<? extends K,? extends V> m)
- 将指定映射的所有映射关系复制到此映射中,这些映射关系将替换此映射目前针对指定映射中所有键的所有映射关系。
public V remove(Object key)
- 从此映射中移除指定键的映射关系(如果存在)。
public void clear()
- 从此映射中移除所有映射关系。此调用返回后,映射将为空。
public Set<K> keySet()
-
返回此映射中所包含的键的
Set
视图。
public Collection<V> values()
-
返回此映射所包含的值的
Collection
视图。
public Set<Map.Entry<K,V>> entrySet()
-
返回此映射所包含的映射关系的
Set
视图。
Map使用举例:
public class HashMapTest{
public void go(){
Map<String, String> map=new Hash Map<String, String> (); map.put("Jack","13000001111"); map.put("Mary","13111110000");
map.put("Tom","13333332222");
map.put("Jack","13800008888"); //覆盖掉第一个值
System.out.println(map);
System.out.println("是否有Mary的电话号码:"+map.containsKey("Mary"));
String Code=map.get("Tom");
System.out.println("Tom的电话是:"+Code);
map.remove("Tom"); //删除Tom的记录 System.out.println(map);
Set<String> nameSet= map.keySet();
System.out.println(nameSet);
Collection <String> telColl=map.values();
System.out.println(telColl);
Set entrySet=map.entrySet();
System.out.println(entrySet);
} public static void main(String[] argvs){
new HashMapTest().go();
}
}