什么是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
扫描二维码添加微信 
  • ,每次淘宝领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘50元优惠券!添加微信后回复机械键盘即可领取!
    支持我们,就用微信淘宝!