Java hashcode浅析
来源:互联网 发布:辐射4捏脸数据 美女 编辑:程序博客网 时间:2024/06/05 16:35
散列码(hash code)是由对象导出的一个整型值。散列码是没有规律的,并且如果x和y是两个不同的对象,那么x的hash code与y的hash code基本上不会相同。对象间进行比较时,默认比较的是两个对象的hash code的值是否相同。
在Object类中定义了一个hashcode()的方法,因此每一个对象都有一个默认的hash code,其值为该对象存储的地址。
我们可以自己定义一个类来验证一下:
public class HashCodeDemo {public static void main(String[] args) {Node n1 = new Node("a",10);Node n2 = new Node("a",10);System.out.println("n1 equals n2?" + n1.equals(n2));System.out.println("n1 hashcode: " + n1.hashCode());System.out.println("n2 hashcode: " + n2.hashCode());}}class Node{String name;int age;Node(String _name, int _age){this.name = _name;this.age = _age;}}/*
输出:n1 equals n2?falsen1 hashcode: 366712642n2 hashcode: 1829164700*/可以发现,两个对象即使类型一样,内部属性也一样,其hashcode值也是不同的,这显然不符合我们使用equal()方法的需要。事实上,许多常用的对象内部都重写了hashcode方法。例如,Integer重写了hashcode,返回的是其内部的值;String类的hashcode也与其内部值有关,实现如下:
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }我们也可以通过一个例子来验证:
public class HashCodeDemo {public static void main(String[] args) {Integer i1 = Integer.valueOf(3);Integer i2 = Integer.valueOf(3);System.out.println("i1 equals i2?" + i1.equals(i2));System.out.println("i1 hashcode: " + i1.hashCode());System.out.println("i2 hashcode: " + i2.hashCode());String s1 = "STR";String s2 = "STR";System.out.println("s1 equals s2?" + s1.equals(s2));System.out.println("s1 hashcode: " + s1.hashCode());System.out.println("s2 hashcode: " + s2.hashCode());}}/*输出:i1 equals i2?truei1 hashcode: 3i2 hashcode: 3s1 equals s2?trues1 hashcode: 82449s2 hashcode: 82449*/我们在定义类的时候也可以自己来实现其hashcode方法,且eclipse能够根据类的属性,自动生成其的hashcode方法:
public class HashCodeDemo {public static void main(String[] args) {NodeWithHash nw1 = new NodeWithHash("a",10);NodeWithHash nw2 = new NodeWithHash("a",10);System.out.println("nw1 equals nw2?" + nw1.equals(nw2));System.out.println("nw1 hashcode: " + nw1.hashCode());System.out.println("nw2 hashcode: " + nw2.hashCode());}}class NodeWithHash{String name;int age;NodeWithHash(String _name, int _age){this.name = _name;this.age = _age;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;NodeWithHash other = (NodeWithHash) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}}/*输出:nw1 equals nw2?truenw1 hashcode: 1368nw2 hashcode: 1368*/
0 0
- Java hashcode浅析
- Java equals() 、hashCode()浅析
- 浅析Java中的hashcode方法
- Java中== equals hashcode浅析:
- 浅析java中的hashcode()方法与equals()方法
- [Java] Object方法浅析(一): equals与hashCode
- 浅析Java中equals()方法和hashCode方法
- hashcode方法浅析
- hashcode方法浅析
- hashcode方法浅析
- hashcode方法浅析
- hashCode方法浅析
- Java HashCode
- java hashCode
- Java hashCode
- Java HashCode
- Java HashCode
- Java hashCode
- Defense Lines UVA
- Android 与H5交互的小Demo
- Mac下通过Homebrew安装redis
- libgcrypt使用举例
- 网狐6603 框架
- Java hashcode浅析
- Apache+PHP
- title: JavaFx自定义Tab-Order
- Ubuntu下忘记MySQL root密码解决方法
- 显示权限的名称
- Linux time时间概述
- 【数据压缩】DPCM 压缩系统的实现和分析
- Leetcode 312. Burst Balloons
- openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例)