HashMap是面试官很喜欢问的一个问题,这里简单的分析一下。
HashMap继承自AbstractMap类,实现了Map,Cloneable,Serializable接口。
它的基础是hashing,要了解hashMap,我们需要弄明白几个概念:
- hashFunction
- hashValue
- bucket
1.hashFunction:返回一个integer值的方法.
2.hashValue,hashFunction返回的integer值.
3.bucket(Entry[]table),它是用来存储键值对链表的集合.
接下来我们进一步了解HashMap
public V get(Object key) {
//假如key存在于map里面,则返回value,否则返回null
}
在HashMap中有个内部类,叫Entry(Map.Entry),键值对就是以Entry<K,V>的链表结构存放在map中,HashMap的get(Key K)方法通过对Key对象调用hash方法,得到其的hashValue,然后通过indexFor(hashValue)找到bucket对应的entry对象。
值得注意的一点是,null亦可以作为key,它的hashValue总是0,对应到的bucket的下标总是第一个table[0].
可能会有人问,如果两个key对象的hashValue一样怎么办?
这里我们就需要用到equals方法,之前提到bucket是一个键值对的链表集合,当我们通过index找到entry对象,我们需要对entry这个链表对象进行遍历,直到key.equals(entry.key)返回true.
Entry<K,V> getEntry(Object k){
int hash = k==null?0:hash(k);
for(Entry e = table[indexFor(hash,table.length)];e!=null;e.next){
object key;
if(e.hash == hash && ((key = e.key) == k || (k!=null && k.equals(key) ){
return e;
}
}
return null;
}
也许有人要问,那如果两个key对象的hashValue和hashCode都一样怎么处理?
这里,HashMap会用后加入的entry对象覆盖掉之前的entry对象。
在HashMap中有两个重要的参数,capacity & load factor,
capacity,定义bucket的大小,必须是2的倍数(默认16)
load factor是用来限定当bucket里面的entry对象的数量增长超过一定限度的时候,HashMap将会对bucket的size * 2处理(默认.75)
最后HashMap的get和put方法都是很快的,时间复杂度是o(1).
分享到:
相关推荐
在Java的集合框架中,HashSet,HashMap是用的比较多的一种,顺序结构的ArrayList、LinkedList这种也比较多,而像那几个线程同步的容器用的比较少,像Vector和HashTable,因为这两个线程同步的容器已经不被JDK推荐...
`HashMap`、`Hashtable`和`HashSet`都是基于`Map`或`Set`接口实现的不同数据结构,它们在功能、线程安全性和性能等方面有显著差异。 首先,`HashMap`和`Hashtable`都实现了`Map`接口,这意味着它们都可以存储键值对...
ArrayList和Vector,以及HashMap和Hashtable,都是常用的容器,但它们之间存在一些关键的区别,这将影响到在不同场景下的选择和使用。 首先,我们来看ArrayList和Vector的区别: 1. **同步性**: - `ArrayList` ...
在Java编程语言中,HashMap和Hashtable都是用于存储键值对的数据结构,它们都实现了Map接口。然而,两者之间存在一些显著的区别,这些差异主要体现在线程安全性、空值支持、继承结构以及方法实现等方面。以下是关于...
### Java集合浅析 #### 一、概述 Java集合框架是Java编程语言中处理数据结构的一个强大工具包,它提供了一系列灵活高效的接口和实现来帮助开发者管理数据。本篇文章将重点介绍Java中常用的集合类——`Collection`...
【ASP.NET笔试题浅析】 ASP.NET笔试题涵盖了C#和.NET框架的基础知识,以及ASP.NET应用程序开发的关键概念。以下是一些重点知识点的详细解析: 1. **类和结构的区别**: - 类是引用类型,结构是值类型。这意味着类...
在本压缩包中,主要包含了一份关于“浅析《Java程序设计》的微课设计与实现”的PDF文档,这显然是一份深入探讨如何利用微课技术来教授Java编程的资料。微课是一种短小精悍的教学模式,通常涵盖一个特定的主题或技能...
浅析Java8 中 Map 接口的新方法 Java8 中 Map 接口的新方法是指 Java8 中引入的一些新的方法,用于提高 Map 接口的使用效率和便捷性。在本文中,我们将详细介绍 Java8 中 Map 接口的新方法,并通过代码实例来演示其...
ArrayList、LinkedList、HashSet、HashMap等是常用的集合实现,它们各自具有不同的特性和适用场景。JAVA还提供了泛型(Generic)来增强集合的安全性,避免类型转换异常。同时,接口如List、Set和Map定义了集合的基本...
在代码示例中,我们创建了一个JSONArray对象,并通过构造器的方式以及fromObject方法分别将ArrayList和HashMap对象转换成JSONArray对象。在使用fromObject方法时,需要注意的是,它将每个HashMap对象转换成一个独立...
Dictionary类不提供具体的实现,而是作为一个基础,供子类如Hashtable和HashMap扩展。通过键来访问数据,使得字典类在需要关联数据而不是顺序访问的场景下非常有用。 哈希表(Hashtable)类是基于键值对的数据结构...
集合类如HashMap、ArrayList等会存储对象的引用。如果集合不再使用,但没有被清空或置为空,那么它们所包含的对象也无法被回收。 3. 事件监听器和回调。注册的监听器如果没有在不再需要时正确注销,可能会导致相关...
HashSet类是基于HashMap实现的,因此它在插入、删除和查找元素时具有较好的性能,但不保证元素的顺序。当我们向HashSet中添加元素时,元素的哈希码(hashCode)和equals方法会被用来决定元素是否已存在。如果两个...
final HashMap, String> map = new HashMap, String>(); for (int i = 0; i ; i++) { new Thread(new Runnable() { @Override public void run() { map.put(UUID.randomUUID().toString(), ""); } }).start();...
- `hashCode()`:返回对象的哈希码,用于散列存储,比如HashMap中。 - `notify()`:唤醒在该对象监视器上等待的单个线程。 - `notifyAll()`:唤醒在该对象监视器上等待的所有线程。 - `toString()`:返回对象的...
1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系: ...
4. **HashMap存储结构浅析** HashMap是Java中常用的数据结构,用于存储键值对。它基于哈希表实现,提供O(1)的平均查找时间。深入理解HashMap的内部工作,包括哈希函数、链表和红黑树的转换,对于提高代码效率有帮助...
Map, Integer> map = new HashMap(); // 填充map... Iterator, Integer>> iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry, Integer> entry = iterator.next(); String key = ...