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

我的理解就是这三者原则上没有关系。
//下面这段非原创,自己还没有理解—先记上去
但是有如下约定的关系
/* 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值为索引进行一系列操作。

Java,`equals()`和`==`都是用来比较两个对象的方法,但是它们的作用不同。 `equals()`方法用于比较对象的内容是否相等,即比较对象的属性值是否相等。默认情况下,`equals()`方法比较的是两个对象的地址是否相等,如果想要比较对象的属性值是否相等,就需要在对应类重写`equals()`方法。一般而言,如果一个类重写了`equals()`方法,通常也需要重写`hashCode()`方法。 `==`运算符用于比较两个对象的地址是否相等,即判断两个对象是否是同一个对象。如果两个对象的地址相等,则它们一定是同一个对象;如果两个对象的地址不相等,则它们不一定是不同的对象,可能是同一类的不同对象。 举个例子,假设有一个Person类,包含两个属性name和age。当我们使用`equals()`方法比较两个Person对象时,比较的是它们的name和age属性值是否相等;而当我们使用`==`运算符比较两个Person对象时,比较的是它们的地址是否相等。 ``` Person p1 = new Person("张三", 20); Person p2 = new Person("张三", 20); Person p3 = p1; System.out.println(p1.equals(p2)); // true System.out.println(p1 == p2); // false System.out.println(p1 == p3); // true ``` 在上面的例子,p1和p2虽然属性值相等,但是它们是两个不同的对象,因此使用`==`运算符比较结果为false;而p1和p3是同一个对象,因此使用`==`运算符比较结果为true。`equals()`方法比较的是p1和p2的属性值是否相等,因此结果为true。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值