HashMap及hashcode()方法的简单介绍

  当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。也就是说两个hashcode相同的值,equals之后不一定为true。

HashMap是在bucket中储存键对象和值对象,作为Map.Entry,Entry是存储键值对的一个对象。当两个值hashcode相同时,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在链表中。如果两个键的hashcode相同,如何获取值对象?调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。

  HashMap默认的负载因子大小为0.75,也就是说,当一个map填满了75%的bucket时候,和其它集合类(如ArrayList等)一样,将会创建原来HashMap大小的两倍的bucket数组,来重新调整map的大小,并将原来的对象放入新的bucket数组中。这个过程叫作rehashing,因为它调用hash方法找到新的bucket位置。

  为什么String, Interger这样的wrapper类适合作为键? String, Interger这样的wrapper类作为HashMap的键是再适合不过了,而且String最为常用。因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。不可变性还有其他的优点如线程安全。如果你可以仅仅通过将某个field声明成final就能保证hashCode是不变的,那么请这么做吧。因为获取对象的时候要用到equals()和hashCode()方法,那么键对象正确的重写这两个方法是非常重要的。如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。

  我们可以使用自定义的对象作为键吗? 这是前一个问题的延伸。当然你可能使用任何对象作为键,只要它遵守了equals()和hashCode()方法的定义规则,并且当对象插入到Map中之后将不会再改变了。如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。

转自:http://www.importnew.com/7099.html

原文地址:https://www.cnblogs.com/supertan/p/9240710.html

时间: 2024-07-31 19:56:45

HashMap及hashcode()方法的简单介绍的相关文章

DBMS_OUTPUT.PUT_LINE()方法的简单介绍

1.最基本的DBMS_OUTPUT.PUT_LINE()方法. 随便在什么地方,只要是BEGIN和END之间,就可以使用DBMS_OUTPUT.PUT_LINE(output);然而这会有一个问题,就是使用该函数一次最多只可以显示255个字符,否则缓冲区会溢出. 此外,函数DBMS_OUTPUT.ENABLE(20000)这种函数,仅仅是设置整个过程的全部输出缓冲区大小,而非DBMS_OUTPUT.PUT_LINE()的缓冲区大小. 对于超过255个字符的变量,使用DBMS_OUTPUT.PUT

实现跨域iframe接口方法调用 简单介绍

实现跨域iframe接口方法调用 简单介绍: 页面a.html域名为www.a.com,嵌入页面http://www.b.com/b.html. b.html要调用a.html中的js函数,由于两个页面不在一个域中,会提示没权限. 下面就介绍一下如何如何解决此问题,需要的朋友可以做一下参考. 一.cross.js代码如下: (function(global){ global.Cross = { signalHandler: {}, on: function(signal, func){ this

网络测量中基于Sketch方法的简单介绍

Sketch介绍 为什么要用Sketch 网络流主要根据五元组.主机地址.包的大小来分类.在网络中存在各种各样的包,如果按照上述分类方法,对每一种包都分配一个计数器来储存,虽然测量准确,那么存放计数器的空间开销会非常大.所以使用哈希的方法,根据哈希值的范围来确定的所需的存储空间,各种包根据哈希值再次归类,可以大大减少存储空间.这样使用哈希来估计流的方法称为Sketch-based方法. Count-min sketch 如何处理包 使用哈希的方法会产生冲突,多个种类的包哈希到同一个桶内,那么这个

iOS 设计中关于UIScrollViewDelegate的几个代理方法的简单介绍

在ios设计的过程中,对于UIScrollView这个控件对于开发者而言都不会陌生,在处理UI界面的时候我们经常会用到UIScrollView,既然用到了UIScrollView,那么UIScrollView的几个代理方法就无法避免的被使用了.本文并不介绍UIScrollView的相关属性,就介绍几个代理方法. / 此方法在scrollView滑动时会被调用多次,只要scrollView.contentOffset发生改变就会被调用 / (void)scrollViewDidScroll:(UI

eclipse的调试方法的简单介绍

声明:本文不是自己 作为编程人员,程序的调试是一项基本功.在不使用IDE的时候,程序的调试多数是通过日志或者输入语句(System.out.println)的方式.可以把程序运行的轨迹或者程序运行过程中的状态显示给用户,用户据此对程序进行分析调试.实际上这样的调试并不是非常方便. 在多数IDE中都提供了debug功能,可以让用户单步执行程序,在执行的过程中来查看程序中的各变量的状态.并且在程序运行过程中还可以调整状态的值. 下面以Eclipse为例介绍如何使用debug调试程序. 注意:要使用E

一.SalesForce中Schema类的简单介绍

一.Schema以及Schema NameSpace是什么 在SalesForce中Schema指的是应用程序中对象(Object)以及对象之间的各种关系.Schema NameSpace中包含了好多的类和方法,通过这些类和方法,可以访问Schema的一些基本信息. 二.Schema常用的类和方法 在Schema NameSpace中包含了很多的类以及方法,在此并不会对所有的类和方法做介绍,只会对其中几个类的几个方法做简单介绍. 1.Schema.getGlobalDescribe方法``这个方

CFileDialog的使用方法简单介绍

CFileDialog文件选择对话框的使用:首先构造一个对象并提供对应的參数,构造函数原型例如以下: CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParen

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍,及演示。

InputStreamReader 和 OutputStreamWriter类使用方法简单介绍. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是字节流通向字符流的桥梁.假设不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK. 构造方法: InputStreamReader isr = new InputStreamReader(InputStream in);//构造一个默认编码集的InputStreamReader类 Inp

PHP在浏览器上跟踪调试的方法以及使用ChromePhp、FirePHP的简单介绍

之前用ThinkPHP时发现有个 trace 函数可以跟踪调试,感觉很有意思,网上搜索了下类似的东西,发现了 ChromePhp ,以前没想过这样来调试 PHP 程序,感觉非常方便,很有用. ThinkPHP 使用的是自己生成的 HTML 随模版一起输出来显示,偶尔会遇到一些莫名其妙的问题,效果不是太好, 还有一些也是类似的方法,但输出的主要是在模版中增加 JS 代码,调用浏览器的调试方法进行输出调试 如 console.log('PHP的一些调试输出内容'); ChromePhp 是通过hea