浅谈Java中的Hashmap

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

原文地址:https://www.cnblogs.com/bosongokay/p/7489105.html