• Tags ,         
  • 2018-06-25  12:17:43        
  • 85 °C    

    什么是HashMap?

    自1.2版以来,HashMap是Java中集合的一部分。它提供了Java的Map接口的基本实现。它将数据存储在(Key,Value)对中。要访问一个值,你必须知道它的密钥,否则,你不能访问它。HashMap被称为HashMap,因为它使用了哈希技术。哈希是一种将大字符串转换为表示相同字符串的小字符串的技术。较短的值有助于索引和更快的搜索。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键,但只有一次和多个空值。这个类不能保证地图的顺序; 特别是,它不能保证订单会随着时间的推移保持不变。它与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(...));
    

    现在地图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中的方法

    1. void clear():用于从Map中删除所有映射。
    2. boolean containsKey(Object key):用于返回True如果对于指定的键,则映射存在于映射中。
    3. boolean containsValue(Object value):用于在一个或多个键映射到指定值时返回true。
    4. Object clone():它用于返回所提到的哈希映射的浅表副本。
    5. boolean isEmpty():用于检查映射是否为空。如果地图为空,则返回true。
    6. set entrySet():用于返回哈希映射的set视图。
    7. Object get(Object key):用于检索或获取特定键映射的值。
    8. Set keySet():用于返回键的设置视图。
    9. int size():用于返回Map的大小。
    10. Object put(Object key,Object value):用于将键值对的特定映射插入到映射中。
    11. putAll(Map M):用于将所有元素从一个Map复制到另一个Map。
    12. Object remove(Object key):用于删除Map中任何特定键的值。
    13. Collection values():用于返回HashMap中值的Collection视图。

     
    转载请保留页面地址:https://www.breakyizhan.com/java/4653.html