• 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方法的次数就大大降低了,几乎只需要一两次。

    每天进步一丢丢

    完成。

  • 相关阅读:
    【转】Winform窗体显示在父窗体的中间位置几种代码
    【转】图片上传
    【转】Web文件的ContentType类型大全
    【原】FileUpload控件上传文件
    【转】winform编程实现程序最小化到系统托盘代码
    【原】页面跳转以及表单提交中有中文的解决办法
    【转】asp.net弹出窗体大全
    .NET的发展及组成结构
    如何成为一个优秀的程序员?
    设计模式详细系列教程 (二) 创建型模式
  • 原文地址:https://www.cnblogs.com/xiaofuzi123456/p/12748502.html
Copyright © 2020-2023  润新知