`
guoyanwei_ok
  • 浏览: 26940 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java hashcode equals == 区别

    博客分类:
  • java
阅读更多

Object a = new Object(); 产生了两个对象 ,引用对象a ,实体对象 new Object();

1. 当两个对象 "==" 返回true 的时候 ,说明引用对象是一致的。

  1. Object a = new Object() ;
  2. Object b = a ;
  3. System.out.println(a == b);//返回True
  4. String stra = new String("a");
  5. String strb = stra; String strc = new String("a");
  6. System.out.println(stra == strb);//返回true
  7. System.out.println(stra==strc);//返回false

2.equals方法 在Object 的实现是

  1. public boolean equals(Object obj) {
  2.  return (this == obj);
  3. }

可见判断引用。但是随着继承后重写而发生了一些变化 。比如String,

先看他的实现方式:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = offset;
                int j = anotherString.offset;
                while (n-- != 0) {
                    if (v1[i++] != v2[j++])
                        return false;
                }
                return true;
            }
        }
        return false;
    }

首先也是判断引用是否相同,如果不同看每个char是否相同(内容相同)。

 

再看Integer的是实现方式:

  1. public boolean equals(Object obj) {
  2.     if (obj instanceof Integer) {
  3.      return value == ((Integer)obj).intValue();
  4.     } return false;
  5. }

 直接判定实际值是否相同。 所以equals 方法要看具体的实现情况。

 

 3.hashcode

3.1在Object类中只有一句话:

public native int hashCode();具体怎么实现,有朋友知道可以告诉我。

但是有个原则:(单一环境下)

                   1、如果两个对象相同,那么它们的hashCode值一定要相同;

                   2、如果两个对象的hashCode相同,它们并不一定相同。上面说的相同是equals 比较产生的。

 

3.3 不谈集合谈hashcode没有太大意义:首先,想要明白hashCode的作用,你必须要先知道Java中的集合。   Java中的集合Set是元素无序,但元素不可重复。

那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?

这就是Object.equals方法了。

但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。

也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。

这显然会大大降低效率。 于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。

 

哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。 初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。 这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。 所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics