Java中的Java.util.HashMap的定义以及用法

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

什么是HashMap?

自1.2版以来,HashMap是Java中集合的一部分。它提供了Java的Map接口的基本实现。它将数据存储在(Key,Value)对中。要访问一个值,你必须知道它的密钥,否则,你不能访问它。HashMap被称为HashMap,因为它使用了哈希技术。Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。较短的值有助于索引和更快的搜索。HashSet也在内部使用HashMap。它在内部使用链接列表来存储键值对。我们将在其他文章中详细了解HashSet。

HashMap的定义

public class HashMap extends AbstractMap implements
Map, Cloneable, Serializable

HashMap保存在java.util包中。正如你在上面的HashMap定义中看到的那样,它扩展了一个抽象类AbstractMap,它也提供了一个不完整的Map接口实现。正如你所看到的,它也实现了Cloneable和Serializable接口。 上述定义中的K和V分别代表Key和Value。 HashMap不允许重复的键,但允许重复的值。这意味着单个键不能包含多于1个值,但多于1个键可以包含单个值。HashMap也允许null键,但只有一次和多个空值。这个类不能保证map的顺序。它与HashTable大致相似,但是不同步。

HashMap的内部结构

内部HashMap包含一个Node数组。并且节点被表示为包含4个字段的类:

  1. int hash
  2. K键
  3. V值
  4. 下一个节点

我们可以看到该节点包含自己对象的引用。所以这是一个链表。 HashMap:

节点:

HashMap的时间复杂度

HashMap为基本操作提供了恒定的时间复杂度,如果散列函数被正确写入并且它正确地将元素分散到桶中,则获取和放入。HashMap上的迭代取决于HashMap的容量和键值对的数量。基本上它与容量+容量成正比。容量是HashMap中桶的数量。因此,最初在HashMap中保留大量的桶并不是一个好主意。

HashMap的性能

HashMap的性能取决于2个参数:

  1. 初始容量
  2. 负载因数

如前所述,容量只是桶的数量,初始容量是HashMap实例创建时的容量。负载因数是在重新调整应该完成时的一种度量。重新粉刷是增加容量的过程。在HashMap中,容量乘以2. Load Factor也是衡量HashMap允许在再次散列之前填充的部分。当HashMap中的条目数量增加当前容量和负载因子的乘积时,容量增加,即正在进行重新哈希。如果我们将初始容量保持得更高,那么重新调整将永远不会完成。但通过保持较高的值,它会增加迭代的时间复杂度。所以应该非常巧妙地选择它来提高性能。应该考虑预期的值的数量来设定初始容量。通常优先的负载因子值是0.75,这在时间和空间成本之间提供了很好的交易。负载因子的值在0和1之间变化。

同步HashMap

据了解,HashMap是不同步的,即多个线程可以同时访问它。如果多个线程同时访问这个类,并且至少有一个线程在结构上操作它,那么有必要使它在外部同步。它通过同步封装地图的某个对象来完成。如果不存在这样的对象,则可以将它包装在Collections.synchronizedMap()中以使HashMap同步并避免意外的非同步访问。如下例所示:

Map m = Collections.synchronizedMap(new HashMap(..));

现在map m被同步。

如果在创建迭代器之后进行任何结构修改,除了通过迭代器的remove方法以外的任何其他方式,此类的迭代器都是快速失败的。在迭代器失败时,它会抛出ConcurrentModificationException。

HashMap的构造函数

HashMap提供了4个构造函数,每个访问修饰符都是public:

  1. HashMap():它是默认的构造函数,它创建一个初始容量为16,加载因子为0.75的HashMap实例。
  2. HashMap(int initial capacity):它创建一个具有指定初始容量和加载因子0.75的HashMap实例。
  3. HashMap(int initial capacity,float loadFactor):它创建一个具有指定初始容量和指定加载因子的HashMap实例。
  4. HashMap(Map map):使用与指定映射相同的映射创建HashMap的实例。

HashMap的方法:

// Java program to illustrate  
// Java.util.HashMap 
import java.util.HashMap; 
import java.util.Map; 
  
public class GFG 
{ 
    public static void main(String[] args)  
    { 
      
        HashMap<String, Integer> map = new HashMap<>(); 
          
        print(map); 
        map.put("vishal", 10); 
        map.put("sachin", 30); 
        map.put("vaibhav", 20); 
          
        System.out.println("Size of map is:- " + map.size()); 
      
        print(map); 
        if (map.containsKey("vishal"))  
        { 
            Integer a = map.get("vishal"); 
            System.out.println("value for key \"vishal\" is:- " + a); 
        } 
          
        map.clear(); 
        print(map); 
    } 
      
    public static void print(Map<String, Integer> map)  
    { 
        if (map.isEmpty())  
        { 
            System.out.println("map is empty"); 
        } 
          
        else
        { 
            System.out.println(map); 
        } 
    } 
} 

输出:

output :- map is empty
Size of map is:- 3
{vaibhav=20, vishal=10, sachin=30}
value for key "vishal" is:-10
map is empty

HashMap中的方法

  •   本文标题:Java中的Java.util.HashMap的定义以及用法 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/4653.html

    "Java中的Java.util.HashMap的定义以及用法"的笔记

    • Arvin Chen

      2018年9月26日 上午9:33

      遍历HashMap的四种方法

      public static void main(String[] args) {
        Map<String,String> map=new HashMap<String,String>();
              map.put("1", "value1");
              map.put("2", "value2");
              map.put("3", "value3");
              map.put("4", "value4");
              
              //第一种:普通使用,二次取值
              System.out.println("\n通过Map.keySet遍历key和value:");  
              for(String key:map.keySet())
              {
               System.out.println("Key: "+key+" Value: "+map.get(key));
              }
              
              //第二种
              System.out.println("\n通过Map.entrySet使用iterator遍历key和value: ");  
              Iterator map1it=map.entrySet().iterator();
              while(map1it.hasNext())
              {
               Map.Entry<String, String> entry=(Entry<String, String>) map1it.next();
               System.out.println("Key: "+entry.getKey()+" Value: "+entry.getValue());
              }
              
              //第三种:推荐,尤其是容量大时  
              System.out.println("\n通过Map.entrySet遍历key和value");  
              for(Map.Entry<String, String> entry: map.entrySet())
              {
               System.out.println("Key: "+ entry.getKey()+ " Value: "+entry.getValue());
              }
              
              //第四种  
              System.out.println("\n通过Map.values()遍历所有的value,但不能遍历key");  
              for(String v:map.values())
              {
               System.out.println("The value is "+v);
              }
       }
    • Arvin Chen

      2018年9月26日 下午1:33

      Hashmap的排序

      按KEY排序

      public class HashMapTest {
          public static void main(String[] args) {
              Map<String, String> map = new HashMap<String, String>();
              map.put("c", "ccccc");
              map.put("a", "aaaaa");
              map.put("b", "bbbbb");
              map.put("d", "ddddd");
       
              List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
              Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
                  //升序排序
                  public int compare(Entry<String, String> o1,
                          Entry<String, String> o2) {
                      return o1.getKey().compareTo(o2.getKey());
                  }
       
              });
       
              for(Map.Entry<String,String> mapping:list){ 
                     System.out.println(mapping.getKey()+":"+mapping.getValue()); 
                } 
           }
      }

      按value排序

      public class HashMapTest {
          public static void main(String[] args) {
              Map<String, String> map = new HashMap<String, String>();
              map.put("c", "ccccc");
              map.put("a", "aaaaa");
              map.put("b", "bbbbb");
              map.put("d", "ddddd");
       
              List<Map.Entry<String,String>> list = new ArrayList<Map.Entry<String,String>>(map.entrySet());
              Collections.sort(list,new Comparator<Map.Entry<String,String>>() {
                  //升序排序
                  public int compare(Entry<String, String> o1,
                          Entry<String, String> o2) {
                      return o1.getValue().compareTo(o2.getValue());
                  }
       
              });
       
              for(Map.Entry<String,String> mapping:list){ 
                     System.out.println(mapping.getKey()+":"+mapping.getValue()); 
                } 
           }
      }
    扫描二维码添加微信 
  • ,领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘优惠券!添加微信后,分享淘宝选中的机械键盘给淘宝机器人即可领取!
    支持我们,就用微信淘宝!

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读