㈠ java中hash是什么意思
hash是一种算法 就是数据结构中的散列表 既是一种查找方法,也是数据存储方法,例如hashmap hashset
㈡ java:哈希表的原理与用法
Hashtable,原理嘛就不知道了。只知道说其是提供了两个集合之间映射的能力,并且拥有每个元素的查询时间近乎恒定的特性。两个集合之间映射的能力,简单的说,就是像是存放系统属性的Properties类一样(该类继承自Hashtable),Properties类中将String映射到String,你可以用setProperty(String key, String value)把一对值对(key,value)存入Properties中,用getProperty(String key) 取得key对应的value值。用System.getProperties()你可以获得一个系统属性的哈希表,直接println出来你就可以看到整个哈希表所构成的集合了。第一个元素应该是java.runtime.name=Java(TM) SE Runtime Environment这个。这里你可以看得出"java.runtime.name"被映射到了"Java(TM) SE Runtime Environment"。在这里你也可以调用System.getProperties().getProperty("java.runtime.name")得到字符串"Java(TM) SE Runtime Environment"。这就是哈希表所提供的功能了,将一个元素映射到另一个元素,这之间的映射所构成的集合就是哈希表了。
你可以自己看看API文档,里面有详细的解说,不过嘛,嘿嘿,中文版的那个翻译啊,哎,惨不忍睹啊,感触最多的是——主谓宾都难找啊。
㈢ 关于java的哈希值
HASH
是散列表的基础计算方法,Java
内置了
hash
的支持,java.lang.Object
默认是通过对象在内存的地址计算出来的,所以每个对方都是唯一的
hash,但是当我们创建我们自己的对象类时,我们根据需要和业务逻辑来决定是否提供自己的
hashcode
和
equals
方法。
多个对象的
hash
可能重复,这是正常的,重复的对象在
hash
table
中是分配在同一个槽
(一个可以通过计算直接跳过那个位置的数组)中,会再通过
equals
对比
(在这个槽中的
hash
code
都相同的一个链表中逐一
equals
比较
key)
找到那个对象。
所以逻辑上是否相同是通过
equals
来计算的,而且
equals
相同的两个对象,它们的
hash
也应该相同,如果你不能保证这点,那就说明你的
hashcode
和
equals
方法不是使用相同的算法。
一个对象是否存在不是通过
hash
code
来判断的,而是
equals。
a
==
b
的话,a.equals
(b)
肯定成立,但反过来就不一定。因为
a
==
b
比较的是对象的地址,只有同一个对象才能成立,equals
比较的是逻辑角度上的相等性。
看
String
或其它一个
JRE
自带的类的
hashcode
和
equals
方法是怎么做到的。
㈣ 关于java的哈希值
每个对象都有自己的哈希值,但并不是每次创建对象的时候都要判断有没有相同的对象,如果需要在程序运行中只有一个对象,那么我们一般会使用单例模式类避免重复创建对象,每个对象都有一个hashCode()方法,比如integer a = 10;那么a.hashCode();就是a对象的哈希值,能够使用打印语句输出。
㈤ JAVA中的HASHSET和HASHMap的底层实现是怎样的大致讲一下。
HASHMAP是根据HASH算法储存数据的集合类,每一个存入其中的对象都有一个特定的哈希值!当我们新建一个HashMap对象,如果不给定它的大小,其默认为16,就相当与下面新建了编号为0到15的数组(链表数组)。以默认HashMap为例,put一个对象时,首先得到他的哈希值,在与十五相除得到余数,找到与余数相同编号的数组插入其中!HASHSET就是没有value值的HASHMAP,你可以新建一个HASHSET,插入0到15,绝对以0到15的顺序打印。
㈥ JAVA中哈希码具体是什么
哈希其实只是一个概念,没有什么真实的指向。它的目的是保证数据均匀的分布到一定的范围内。所以不同数据产生相同的哈希码是完全可以的。
java中哈希一般是希望自己写算法的。随便返回什么都可以。如果什么也不写的话就会返回地址。如果自己写,最简单的做法是把所有字段拼起一个长串做个hash值。
㈦ 详解java中hashcode什么时候用,怎么用
有许多人学了很长时间的Java,但一直不明白hashCode方法的作用,
我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。
你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。
那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?
这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。
也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。
哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。
初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。
如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,
就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。
所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;2、如果两个对象的hashCode相同,它们并不一定相同 上面说的对象相同指的是用eqauls方法比较。
你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。hashcode这个方法是用来鉴定2个对象是否相等的。 那你会说,不是还有equals这个方法吗? 不错,这2个方法都是用来判断2个对象是否相等的。但是他们是有区别的。 一般来讲,equals这个方法是给用户调用的,如果你想判断2个对象是否相等,你可以重写equals方法,然后在代码中调用,就可以判断他们是否相等 了。简单来讲,equals方法主要是用来判断从表面上看或者从内容上看,2个对象是不是相等。举个例子,有个学生类,属性只有姓名和性别,那么我们可以 认为只要姓名和性别相等,那么就说这2个对象是相等的。 hashcode方法一般用户不会去调用,比如在hashmap中,由于key是不可以重复的,他在判断key是不是重复的时候就判断了hashcode 这个方法,而且也用到了equals方法。这里不可以重复是说equals和hashcode只要有一个不等就可以了!所以简单来讲,hashcode相 当于是一个对象的编码,就好像文件中的md5,他和equals不同就在于他返回的是int型的,比较起来不直观。我们一般在覆盖equals的同时也要 覆盖hashcode,让他们的逻辑一致。举个例子,还是刚刚的例子,如果姓名和性别相等就算2个对象相等的话,那么hashcode的方法也要返回姓名 的hashcode值加上性别的hashcode值,这样从逻辑上,他们就一致了。 要从物理上判断2个对象是否相等,用==就可以了。
㈧ java hash code 怎么用啊
首先,想要明白hashCode的作用,你必须要先知道Java中的集合。
总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同
上面说的对象相同指的是用eqauls方法比较。
你当然可以不按要求去做了,但你会发现,相同的对象可以出现在Set集合中。同时,增加新元素的效率会大大下降。
㈨ java的LinkedHashSet是怎样实现存取有序的, 底层原理是什么
LinkedHashSet 的实现
对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。
LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并通过传递一个标识参数,调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。
需要注意理解的点是:
LinkedHashSet 是 Set 的一个具体实现,其维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可为插入顺序或是访问顺序。
LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的(具体的区别大家可以自己去思考一下)。
如果我们需要迭代的顺序为插入顺序或者访问顺序,那么 LinkedHashSet 是需要你首先考虑的。
㈩ java中hash函数都有什么用啊
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。
简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系
了解了hash基本定义,就不能不提到一些着名的hash算法,MD5 和 SHA1 可以说是目前应用最广泛的Hash算法,而它们都是以 MD4 为基础设计的。那么他们都是什么意思呢?
这里简单说一下:
1) MD4
MD4(RFC 1320)是 MIT 的 Ronald L. Rivest 在 1990 年设计的,MD 是 Message Digest 的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于 32 位操作数的位操作来实现的。
2) MD5
MD5(RFC 1321)是 Rivest 于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与 MD4 相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好
3) SHA1 及其他
SHA1是由NIST NSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1 设计时基于和MD4相同原理,并且模仿了该算法。