哈希算法
哈希算法能够将不同长度的数据压缩成相同长度。压缩成的数据称为哈希码,
哈希码(HashCode)
哈希码是数据通过哈希算法计算而来的二进制码,又称哈希值、散列值,可以用十六进制表示。当哈希码不同时,数据必定不同;哈希码相同时,数据可能相同,也可能不同。哈希码在Java中常用来表示对象的地址和对象存储的数据。
- 在Objects类中存在一个静态方法hash(),可以对传入的对象的数据计算哈希码。
- 每个对象都拥有一个hashCode()方法,能够对对象在内存中的地址进行计算得到哈希码。也可以用Objects类中的静态方法hashCode()方法计算。
哈希表(Hash)
哈希表是一种包装数据结构,能够对数据进行存储。JDK1.8以前,这种数据结构采用数组+链表的方法实现。一个哈希码对应数组中的一个数据;当数据的哈希码相同时,采用链表存储这些数据。而在JDK1.8中,哈希表则采用数组+链表+红黑树的方法进行实现,当链表长度超过阈值(默认为8)时,会将链表转换为红黑树,这样可以大大提高查找的性能。HashMap
HashMap是java.util.Map中的一个实现类,对数据采用键值对的方式进行存储,是一个无序的、无索引的、Key值不可重复的集合容器。其无序性是指,数据在内部会按照数据的哈希值进行排序,与存入顺序等无关。其中Key值的不可重复性,是根据数据的哈希值和equals()方法进行判断的:首先调用类中的hashCode()方法,若为true,再调用equals()(默认判断地址),若都返回true则判断该数据与其内的某一数据相同。可以重写这两个方法以判断一个数据是否可以加入HashSet中。当加入是数据Key值相同而Value值不同时,会更新Key值对应的Value值。详见包装类 集合。HashSet
HashSet是java.util.Set中的一个实现类,同时继承了HashMap类。HashSet是一个无序的、无索引的、不可重复的单列表容器,其实质也是一个HashMap。加入到其中的数据会存入Key值中,其Value值是一个固定值。其不可重复性与HashMap的判断方式相同。Hashtable
Hashtable是java.util.Map中的一个实现类,具备线程安全性,大部分方法被synchronized修饰。内部的元素不能为空。LinkedHashMap
LinkedHashMap是HashMap的子类,存储数据采用了哈希表+链表结构。通过链表结构可以保证元素顺序与存取顺序一致。