`
zenghuiss
  • 浏览: 26021 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

浅析HashMap

    博客分类:
  • Java
阅读更多
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中的HashMap浅析

    在Java的集合框架中,HashSet,HashMap是用的比较多的一种,顺序结构的ArrayList、LinkedList这种也比较多,而像那几个线程同步的容器用的比较少,像Vector和HashTable,因为这两个线程同步的容器已经不被JDK推荐...

    浅析Java中Map与HashMap,Hashtable,HashSet的区别

    `HashMap`、`Hashtable`和`HashSet`都是基于`Map`或`Set`接口实现的不同数据结构,它们在功能、线程安全性和性能等方面有显著差异。 首先,`HashMap`和`Hashtable`都实现了`Map`接口,这意味着它们都可以存储键值对...

    浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别

    ArrayList和Vector,以及HashMap和Hashtable,都是常用的容器,但它们之间存在一些关键的区别,这将影响到在不同场景下的选择和使用。 首先,我们来看ArrayList和Vector的区别: 1. **同步性**: - `ArrayList` ...

    Java中HashMap和Hashtable的区别浅析

    在Java编程语言中,HashMap和Hashtable都是用于存储键值对的数据结构,它们都实现了Map接口。然而,两者之间存在一些显著的区别,这些差异主要体现在线程安全性、空值支持、继承结构以及方法实现等方面。以下是关于...

    Java 集合浅析.txt

    ### Java集合浅析 #### 一、概述 Java集合框架是Java编程语言中处理数据结构的一个强大工具包,它提供了一系列灵活高效的接口和实现来帮助开发者管理数据。本篇文章将重点介绍Java中常用的集合类——`Collection`...

    ASP.NET笔试题浅析

    【ASP.NET笔试题浅析】 ASP.NET笔试题涵盖了C#和.NET框架的基础知识,以及ASP.NET应用程序开发的关键概念。以下是一些重点知识点的详细解析: 1. **类和结构的区别**: - 类是引用类型,结构是值类型。这意味着类...

    浅析《Java程序设计》的微课设计与实现.zip

    在本压缩包中,主要包含了一份关于“浅析《Java程序设计》的微课设计与实现”的PDF文档,这显然是一份深入探讨如何利用微课技术来教授Java编程的资料。微课是一种短小精悍的教学模式,通常涵盖一个特定的主题或技能...

    浅析Java8 中 Map 接口的新方法

    浅析Java8 中 Map 接口的新方法 Java8 中 Map 接口的新方法是指 Java8 中引入的一些新的方法,用于提高 Map 接口的使用效率和便捷性。在本文中,我们将详细介绍 Java8 中 Map 接口的新方法,并通过代码实例来演示其...

    JAVA高级编程资料

    ArrayList、LinkedList、HashSet、HashMap等是常用的集合实现,它们各自具有不同的特性和适用场景。JAVA还提供了泛型(Generic)来增强集合的安全性,避免类型转换异常。同时,接口如List、Set和Map定义了集合的基本...

    浅析Java中JSONObject和JSONArray使用

    在代码示例中,我们创建了一个JSONArray对象,并通过构造器的方式以及fromObject方法分别将ArrayList和HashMap对象转换成JSONArray对象。在使用fromObject方法时,需要注意的是,它将每个HashMap对象转换成一个独立...

    浅析Java 数据结构常用接口与类

    Dictionary类不提供具体的实现,而是作为一个基础,供子类如Hashtable和HashMap扩展。通过键来访问数据,使得字典类在需要关联数据而不是顺序访问的场景下非常有用。 哈希表(Hashtable)类是基于键值对的数据结构...

    浅析Java中的内存泄漏

    集合类如HashMap、ArrayList等会存储对象的引用。如果集合不再使用,但没有被清空或置为空,那么它们所包含的对象也无法被回收。 3. 事件监听器和回调。注册的监听器如果没有在不再需要时正确注销,可能会导致相关...

    浅析Java中的set集合类型及其接口的用法

    HashSet类是基于HashMap实现的,因此它在插入、删除和查找元素时具有较好的性能,但不保证元素的顺序。当我们向HashSet中添加元素时,元素的哈希码(hashCode)和equals方法会被用来决定元素是否已存在。如果两个...

    sesvc.exe 阿萨德

    final HashMap, String&gt; map = new HashMap, String&gt;(); for (int i = 0; i ; i++) { new Thread(new Runnable() { @Override public void run() { map.put(UUID.randomUUID().toString(), ""); } }).start();...

    浅析Java类和数据结构中常用的方法

    - `hashCode()`:返回对象的哈希码,用于散列存储,比如HashMap中。 - `notify()`:唤醒在该对象监视器上等待的单个线程。 - `notifyAll()`:唤醒在该对象监视器上等待的所有线程。 - `toString()`:返回对象的...

    浅析Android之Adapter用法总结

    1.概念  Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系: ...

    学习笔记

    4. **HashMap存储结构浅析** HashMap是Java中常用的数据结构,用于存储键值对。它基于哈希表实现,提供O(1)的平均查找时间。深入理解HashMap的内部工作,包括哈希函数、链表和红黑树的转换,对于提高代码效率有帮助...

    浅析java中遍历map的两种方式

    Map, Integer&gt; map = new HashMap(); // 填充map... Iterator, Integer&gt;&gt; iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry, Integer&gt; entry = iterator.next(); String key = ...

Global site tag (gtag.js) - Google Analytics