我的理解就是这三者原则上没有关系。
//下面这段非原创,自己还没有理解—先记上去

但是有如下约定的关系 
 /* 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值为索引进行一系列操作。