天天看点

java map定义_Java中的Java.util.HashMap的定义以及用法 - Break易站

Java 集合框架

什么是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个字段的类:

int hash

K键

V值

下一个节点

java map定义_Java中的Java.util.HashMap的定义以及用法 - Break易站

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

java map定义_Java中的Java.util.HashMap的定义以及用法 - Break易站

节点:

HashMap的时间复杂度

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

HashMap的性能

HashMap的性能取决于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:

HashMap():它是默认的构造函数,它创建一个初始容量为16,加载因子为0.75的HashMap实例。

HashMap(int initial capacity):它创建一个具有指定初始容量和加载因子0.75的HashMap实例。

HashMap(int initial capacity,float loadFactor):它创建一个具有指定初始容量和指定加载因子的HashMap实例。

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中的方法