Java ==,equals ,hashCode 的比较

1.Java中的数据类型

  1.1.基本数据类型: byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值即(他们在内存中存放的地址)。

public static void main(String[] args) {
    System.out.println("对象的比较@@@@@@@@@@@@@@@@@@@@@@@");
    String str=new String("asda");
    System.out.println(str==str); //true
}

如果是同一个new出来的对象,通过==比较,结果是true, 对象存放在堆中,栈中存放的是对象的引用(地址),由此可见==是对栈中的值进行比较的,如果想比较堆中对象的内容是否相等,就需要重写equals的方法。

  1.2.引用类型:     即包装类(String ,Date ,Interge,数组等)

代码说明:

public static void main(String[] args) {
        int a =1;
        int b =1;
        Integer integer1=new Integer(1);
        Integer integer2=new Integer(1);

        String str="aa";
        String str1=new String("aa");
        String str2=new String("aa");
        System.out.println(a==b); //true
        System.out.println(integer1==b); //true,自动拆箱int
        System.out.println(str1==str2); //false ,在栈中存放的地址不同
        System.out.println(str==str1);  //false

    }

2、equals的概述

1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。下面是Object类中equals方法:

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

2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。下面是String类对equals进行了重写:

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

3、hashCode

hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。事实上,Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。Java采用了哈希表的原理。

3.1 hashCode的作用

主要应用在Java 的号集合当中   
总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。

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

这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。   
于是,Java采用了哈希表的原理。  

这样一来,当集合要添加新的元素时,

先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 

如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;

如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

每天进步一丢丢

完成。

猜你喜欢

转载自www.cnblogs.com/xiaofuzi123456/p/12748502.html