js实现javahashcode(js的运用)

本文目录一览:

java 的Object类的hashcode方法具体是怎么实现的

一、在Object类中的定义为:

public native int hashCode();

是一个本地方法,返回的对象的地址值。

但是,同样的思路,在String等封装类中对此方法进行了重写。方法调用得到一个计算公式得到的 int值。

二、在重写任何类得hashcode方法时必须遵循以下几点:

1、在Java应用的同一次执行过程中,同一对象被多次调用,则他们的hashcode值必然相同。而对于同一个应用的两次不同的调用,它们的Hashcode值可以相同,也有可能不同。

2、对于两个对象来说,如果他们的equals方法比较返回true,那么这两个对象的hashcode必然相同。这也解释了为什么String类中,如果两个对象的equals方法相同,则他们的hashcode值一定相同。

3、对于两个对象来说,如果使用equals方法返回为false,则他们的hashcode的值有可能相等也可能不等,(如果不同会提高性能,因为在集合中类判断两个对象是否相等,如果其hashcode不等就直接不用判断equals方法了)

4、对于Object对象来说,不同的Object对象的hashcode是不同的,它们返回的是对象的地址,equals返回的也是对象的地址。所以在自己定义的类中如果要添加到集合对象中,最好是要重写hashcode和equals方法,不然会自动继承自Object类中的两个方法根据对象地址来判断。在重写自己定义的类时,通常是在类中的根据某个值如name.hashcode();来进行判断。

三、以HashSet 为例:

当我们使用HashSet时,hashCode()方法就会被得到调用,判断已经存储在集合中的对象的hashCode值是否与所增加。

对象的hashCode值一致,如果“不一致”则直接加进去(不用比较equals()提高效率),如果一致,则进行equals方法的比较,如果返回true,表明集合里面已经有这个对象,不能添加进去了。如果是false表是集合里面没有这个对象,则可以加进去。所以在重写hashcode()或者equals() 方法的任何一个方法时,必须重写另外一个。

示例代码:

/**

* People 手工重写hashcode方法和equals方法 根据name来判断 两个对象是否相等。

*/

class People {

private String name;

public People(String name) {

this.name = name;

}

@Override

public boolean equals(Object obj) {

//如果是自己

if(this==obj){

return true ;

}

//如果是空

if(obj==null ){

return false;

}

//比较两个People的名字是否相同

if(obj!=null obj instanceof People){

if(((People)obj).name.equals(this.name))

return true ;

}

return false;

}

@Override

public int hashCode() {

// String的hashcode本来就是用来比较两个字符是否相等

return name.hashCode();

}

}

23.java里面用对象作为key需要注意些什么?如何实现hashcode

 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。

为什么这么说呢?考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在)

也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。下面这段代码是java.util.HashMap的中put方法的具体实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public V put(K key, V value) {

if (key == null)

return putForNullKey(value);

int hash = hash(key.hashCode());

int i = indexFor(hash, table.length);

for (EntryK,V e = table[i]; e != null; e = e.next) {

Object k;

if (e.hash == hash ((k = e.key) == key || key.equals(k))) {

V oldValue = e.value;

如何实现js对象hashcode

hashCode = function(str){

var hash = 0;

if (str.length == 0) return hash;

for (i = 0; i str.length; i++) {

char = str.charCodeAt(i);

hash = ((hash5)-hash)+char;

hash = hash hash; // Convert to 32bit integer

}

return hash;

}

原创文章,作者:QYB5T,如若转载,请注明出处:https://www.506064.com/n/129393.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
QYB5TQYB5T
上一篇 2024-10-03 23:26
下一篇 2024-10-03 23:26

相关推荐

  • JS Proxy(array)用法介绍

    JS Proxy(array)可以说是ES6中非常重要的一个特性,它可以代理一个数组,监听数据变化并进行拦截、处理。在实际开发中,使用Proxy(array)可以方便地实现数据的监…

    编程 2025-04-29
  • 解析js base64并转成unit

    本文将从多个方面详细介绍js中如何解析base64编码并转成unit格式。 一、base64编码解析 在JavaScript中解析base64编码可以使用atob()函数,它会将b…

    编程 2025-04-29
  • Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的解决方法

    本文将解决Node.js使用Body-Parser处理HTTP POST请求时,特殊字符无法返回的问题。同时,给出一些相关示例代码,以帮助读者更好的理解并处理这个问题。 一、问题解…

    编程 2025-04-29
  • t3.js:一个全能的JavaScript动态文本替换工具

    t3.js是一个非常流行的JavaScript动态文本替换工具,它是一个轻量级库,能够很容易地实现文本内容的递增、递减、替换、切换以及其他各种操作。在本文中,我们将从多个方面探讨t…

    编程 2025-04-28
  • JS图片沿着SVG路径移动实现方法

    本文将为大家详细介绍如何使用JS实现图片沿着SVG路径移动的效果,包括路径制作、路径效果、以及实现代码等内容。 一、路径制作 路径的制作,我们需要使用到SVG,SVG是可缩放矢量图…

    编程 2025-04-27
  • 如何使用JS调用Python脚本

    本文将详细介绍通过JS调用Python脚本的方法,包括使用Node.js、Python shell、child_process等三种方法,以及在Web应用中的应用。 一、使用Nod…

    编程 2025-04-27
  • 如何反混淆美团slider.js

    本文将从多个方面详细阐述如何反混淆美团slider.js。在开始之前,需要明确的是,混淆是一种保护JavaScript代码的方法,其目的是使代码难以理解和修改。因此,在进行反混淆操…

    编程 2025-04-27
  • Python要学JS吗?

    Python和JavaScript都是非常受欢迎的编程语言。然而,你可能会问,既然我已经学了Python,是不是也需要学一下JS呢?在本文中,我们将围绕这个问题进行讨论,并从多个角…

    编程 2025-04-27
  • 解决js ajax post 419问题

    对于使用ajax post请求时出现的419问题,我们需要进行以下几个方面的阐述,包括返回码的含义、可能出现的情况、解决方案等内容。 一、解析419返回码 419返回码表示用户超时…

    编程 2025-04-27
  • Three.js实现室内模型行走

    在本文中,将介绍如何使用Three.js创建室内模型,并在场景中实现行走。为了实现这一目标,需要完成以下任务: 加载室内模型及材质贴图 实现摄像机控制,支持用户自由行走 添加光源,…

    编程 2025-04-25

发表回复

登录后才能评论