java 中== equal hashcode()什么的之间的关系

来源:互联网 发布:mac草莓红试色cockney 编辑:程序博客网 时间:2024/06/05 06:55

我的理解就是这三者原则上没有关系。
//下面这段非原创,自己还没有理解—先记上去
但是有如下约定的关系
/* 24. 返回这个对象的哈希值。支持这个方法是为了提高哈希表的性能,例如HashMap。
25. *
26. * 关于hashCode通常的约定是:
27. * 在一个Java应用程序执行期间,无论何时,在相同的对象上调用这个方法多次,都将返回相同的
28. * 整数,前提是在这个对象上用于equals比较的信息没有改变。在应用程序的不同次执行中,这个
29. * 返回值不必保持一致。
30. *
31. * 如果通过equals(Object)方法比较,两个对象相等,那么在这两个对象上调用hashCode
32. * 方法将产生相同的整型值。
33. *
34. * 通过equals(Object)方法比较,两个对象不相等,并不要求在这两个对象上调用hashCode
35. * 方法也有不同的返回值。然而,程序员应该注意到,对不相等的对象产生不同的整型值可能提高
36. * 哈希表的执行性能。
37. *
38. * 实际上,被Object类定义的hashCode方法对不同的对象确实返回不同的整数。(这是通过
39. * 把对象的内部地址转化为一个整数来实现的,但是这个实现技巧不被Java编程语言需要。)
40. */
41. public native int hashCode();
42.
43. /**
44. * 指示这个其它对象是否和这个对象相等。
45. *
46. * equals方法实现非null对象引用之间的相等关系
47. *
48. * 它是反身的:对于任何非null引用值x,x.equals(x)应该返回true。
49. *
50. * 它是对称的:对于任何非null引用值x 和 y, 当且仅当y.equals(x)返回true时,
51. * x.equals(y)才返回true。
52. *
53. * 它是传递的:对于任何非null引用值,x,y和z,如果x.equals(y)和
54. * y.equals(z)返回true,那么x.equals(z)也应该返回true。
55. *
56. * 它是一致的:对任何非null引用值x和y,多次调用x.equals(y)一直返回true或者false,前提
57. * 是对象上被用在相等比较上的信息没有被修改。
58. *
59. * 对于任何非null引用值x,x.equals(null)应该返回false。
60. *
61. * Object类的equals方法对象上差别可能性最大的相等关系。也就是说,对于任何
62. * 非null引用值x和y,当且仅当这个x和y引用同一个对象时,这个方法才返回true(
63. * x==y是true)
64. *
65. * 注意,无论何时重写这个方法都应该重写hashCode方法,来保证hashCode方法的约定,约定
66. * 指出相等的对象必须有相等的哈希值。
67. */
68. public boolean equals(Object obj) {
69. return (this == obj);
70. }
71.

//下面是原创
1.==:就是个运算符,返回布尔值
如果是引用类型用==,就是判断引用类型是否指向同一处(同一处就是true),不会判断两个引用是否是同一种类型,因为所有引用都能被向上转型成指向object 类.
测试程序:

package test1;import java.util.ArrayList;import java.util.Collections;public class tcg11111 {    public static void main(String[] args) {        // TODO Auto-generated method stub        Integer a =new Integer(1);        Object  b = a ;        if ( b == a)            System.out.println("yes");    }}

output:yes

2.equal是类的函数,object类中有这个函数的实现,就是一个普通的函数而已。
下面是object类中equals的源码,发现它的实现就是和==相同。

public boolean equals(Object obj) {        return (this == obj); }

但是equal和==仍然没有关系。(比如说一个方法里面有个<,我们总不能说这个方法和<有多大关系吧)
这个方法是在不同的地方都可以被重写的。所以要看equals的意思一定要走进这个具体方法里。

  1. hashcode()本质上也是一个方法而已。下面来理解下这个方法。
    hashcode()和这些就更没有关系了,也和内存地址没有p的关系。—–(这段可能不对请斧正)

object类对hashcode只有声明,

   public native int hashCode();

由于我是从c++转过来的,所以native关键字不太清楚什么意思,看样子是只有声明,实现是调用dll(不对请斧正)
然后我们随便看一个子类的实现:
比如Abstractlist类中

    public int hashCode() {        int hashCode = 1;        for (E e : this)            hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());        return hashCode;    }

可以看到是调用容器中类型的hashcode().
然后我随便搞个容器类型Integer,(如果自己的类型应该是继承了object类中的hashcode声明,然后调用的是dll进行实现的)
看看Integer的hashcode()的实现:

    public int hashCode() {        return value;    }

然后我们如果学习过数据结构,就知道有一种散列表,其中会有hash排序,我的理解是这个方法调用来调用取,就是为了得到一个hash值,然后你可以对一组数据进行已hash值为索引进行一系列操作。

0 0
原创粉丝点击