HashMap:
java.lang.Object
∟ java.util.AbstractMap<K,V>
∟ java.util.HashMap<K,V>
类型参数:
K
- 此映射所维护的键的类型V
- 所映射值的类型- public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
HashMap是基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
HashTable:
java.lang.Object
∟java.util.Dictionary<K,V>
∟java.util.Hashtable<K,V>
类型参数:
K
- 此映射所维护的键的类型V
- 所映射值的类型- public class Hashtable<K,V>extends Dictionary<K,V>implements Map<K,V>, Cloneable, Serializable
-
HashTable将键映射到相应的值。任何非
null
对象都可以用作键或值。HashMap与HashTable:
HashTable 继承了Dictionary,是线程安全的,键值对中不能出现 null.
HashMap 实现了 Map接口,是HashTable的轻量级实现(非线程安全的实现),即多个线程访问HashMap时需要为其准备外同步,且Hashmap的键、值可以为空。
遍历Map有两种方式:keySet(效率低)、entrySet(效率高),两种方式都需要创建Iterator迭代器对象,但创建方式有所不同。
keySet():返回值是Map中的key值的集合
entrySet():返回值是set集合, 集合类型为Map.Entry
Demo:
import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; public class Test1 { public static void main(String[] args){ ArrayList<Double> arr1 = new ArrayList<Double>(); arr1.add(1.23); arr1.add(2.21); arr1.add(4.59); // 迭代器方式遍历list Iterator<Double> iterator = arr1.iterator(); while(iterator.hasNext()){ System.out.print(iterator.next()+" "); } System.out.println(); System.out.println("----------分界线---------"); Double arr2[] = arr1.toArray(new Double[0]); // list转数组方式遍历list for(int i=0;i<arr2.length;i++){ System.out.print(arr2[i]+" "); } System.out.println(); System.out.println("----------分界线---------"); HashSet<Double> set1 = new HashSet<Double>(); set1.add(2.25); set1.add(3.78); set1.add(9.54); // 迭代器方式遍历set Iterator<Double> iterator1 = set1.iterator(); while(iterator1.hasNext()){ System.out.print(iterator1.next()+" "); } System.out.println(); System.out.println("----------分界线---------"); // set转数组方式遍历set Double arr3[] = set1.toArray(new Double[0]); for(int i=0;i<arr3.length;i++){ System.out.print(arr3[i]+" "); } System.out.println(); System.out.println("----------分界线---------"); HashMap<Character,Integer> map1 = new HashMap<Character,Integer>(); HashMap<String,Integer> map2 = new HashMap<String,Integer>(); map1.put('d', 5); map1.put('t', 9); map1.put('p',13); map2.put(Character.toString('a'), 1); map2.put("aa", 2); map2.put("aaa", 3); // 迭代器中的entrySet方式遍历HashMap Iterator<Entry<Character,Integer>> iterator3 = map1.entrySet().iterator(); while(iterator3.hasNext()){ Map.Entry<Character, Integer> entry = iterator3.next(); System.out.print(entry.getKey()+":"+entry.getValue()+" "); } System.out.println(); System.out.println("----------分界线---------"); // 迭代器中的KeySet方式遍历HashMap Iterator<String> iterator4 = map2.keySet().iterator(); while(iterator4.hasNext()){ String s = iterator4.next(); System.out.print(s+":"+map2.get(s)+" "); } System.out.println(); System.out.println("----------分界线---------"); System.out.println(map2.containsKey("aa")); System.out.println(map2.containsValue(2)); } }
运行结果:
1.23 2.21 4.59
----------分界线---------
1.23 2.21 4.59
----------分界线---------
2.25 3.78 9.54
----------分界线---------
2.25 3.78 9.54
----------分界线---------
p:13 d:5 t:9
----------分界线---------
aa:2 aaa:3 a:1
----------分界线---------
true
true