zoukankan      html  css  js  c++  java
  • 浅谈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

  • 相关阅读:
    C++ new 解析重载 .
    __cdecl,__fastcall, __stdcall 什么区别? .
    C++构造函数调用顺序
    用gdb调试core dump文件
    placement new(转)
    [精华] 跟我一起写 Makefile
    使用 GDB 调试多进程程序
    第37条:避免对函数中继承得来的默认参数值进行重定义
    程序只运行一个是实例 .
    南通SEO:单页的SEO元素
  • 原文地址:https://www.cnblogs.com/bosongokay/p/7489105.html
Copyright © 2011-2022 走看看