Map 映射
Map是一个以键值对存储的接口
图来自作者 Snow、杨
Map特点
- 数据结构里面包含键值对
- 一个键对应一个值
- 键是唯一的,一个键对应的值也是唯一的
java中的Map
- Hashtable (同步,慢,数据量小)
- HashMap(不支持同步,快,数据量大)
- Properties(同步,文件形式,数据量小)
Hashtable
- K-V 对,K和V都不允许为null。
- 同步,多线程安全
- 无序的
- 适合小数据量
主要方法
-
void clear()
将此哈希表清空,使其不包含任何键。 -
Object clone()
创建此哈希表的浅表副本。 -
boolean contains(Object value)
测试此映射表中是否存在与指定值关联的键。 -
boolean containsKey(Object key)
测试指定对象是否为此哈希表中的键。 -
boolean containsValue(Object value)
如果此 Hashtable 将一个或多个键映射到此值,则返回 true。 -
Enumeration elements()
返回此哈希表中的值的枚举。 -
boolean equals(Object o)
按照 Map 接口的定义,比较指定 Object 与此 Map 是否相等。 -
V get(Object key)
返回指定键所映射到的值,如果此映射不包含此键的映射,则返回 null. 更确切地讲,如果此映射包含满足 (key.equals(k)) 的从键 k 到值 v 的映射,则此方法返回 v;否则,返回 null。 -
int hashCode()
按照 Map 接口的定义,返回此 Map 的哈希码值。 -
boolean isEmpty()
测试此哈希表是否没有键映射到值。 -
Enumeration keys()
返回此哈希表中的键的枚举。 -
Set keySet()
返回此映射中包含的键的 Set 视图。 -
V put(K key, V value)
将指定 key 映射到此哈希表中的指定 value。 -
void putAll(Map<? extends K,? extends V> t)
将指定映射的所有映射关系复制到此哈希表中,这些映射关系将替换此哈希表拥有的、针对当前指定映射中所有键的所有映射关系。 -
protected void rehash()
增加此哈希表的容量并在内部对其进行重组,以便更有效地容纳和访问其元素。 -
V remove(Object key)
从哈希表中移除该键及其相应的值。 -
int size()
返回此哈希表中的键的数量。 -
String toString()
返回此 Hashtable 对象的字符串表示形式,其形式为 ASCII 字符 ", " (逗号加空格)分隔开的、括在括号中的一组条目。 -
Collection values()
返回此映射中包含的键的 Collection 视图。
public class HashtableTest {
public static void main(String[] args) {
Hashtable<Integer,String> ht =new Hashtable<Integer,String>();
//ht.put(1, null); 编译不报错 运行报错
//ht.put(null,1); 编译报错
ht.put(1000, "aaa");
ht.put(2, "bbb");
ht.put(30000, "ccc");
System.out.println(ht.contains("aaa")); //与containsValue 一样
System.out.println(ht.containsValue("aaa"));
System.out.println(ht.containsKey(30000));
System.out.println(ht.get(30000));
ht.put(30000, "ddd"); //更新覆盖ccc
System.out.println(ht.get(30000));
ht.remove(2);
System.out.println("size: " + ht.size());
ht.clear();
System.out.println("size: " + ht.size());
Hashtable<Integer,String> ht2 =new Hashtable<Integer,String>();
for(int i=0;i<100000;i++)
{
ht2.put(i, "aaa");
}
traverseByEntry(ht2);
traverseByKeySet(ht2);
traverseByKeyEnumeration(ht2);
}
public static void traverseByEntry(Hashtable<Integer,String> ht)
{
long startTime = System.nanoTime();
System.out.println("============Entry迭代器遍历==============");
Integer key;
String value;
Iterator<Entry<Integer, String>> iter = ht.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry<Integer, String> entry = iter.next();
// 获取key
key = entry.getKey();
// 获取value
value = entry.getValue();
//System.out.println("Key:" + key + ", Value:" + value);
}
long endTime = System.nanoTime();
long duration = endTime - startTime;
System.out.println(duration + "纳秒");
}
public static void traverseByKeySet(Hashtable<Integer,String> ht)
{
long startTime = System.nanoTime();
System.out.println("============KeySet迭代器遍历==============");
Integer key;
String value;
Iterator<Integer> iter = ht.keySet().iterator();
while(iter.hasNext()) {
key = iter.next();
// 获取value
value = ht.get(key);
//System.out.println("Key:" + key + ", Value:" + value);
}
long endTime = System.nanoTime();
long duration = endTime - startTime;
System.out.println(duration + "纳秒");
}
public static void traverseByKeyEnumeration(Hashtable<Integer,String> ht)
{
long startTime = System.nanoTime();
System.out.println("============KeyEnumeration迭代器遍历==============");
Integer key;
String value;
Enumeration<Integer