• equal&==&hashcode


    == 和 equals 的区别

    Object类中的equals方法和“==”是一样的,没有区别,而String类,Integer类等等一些类,是重写了equals方法,才使得equals和“==不同”,所以,当自己创建类时,自动继承了Object的equals方法,要想实现不同的等于比较,必须重写equals方法。

    “==”比”equal”运行速度快,因为”==”只是比较引用. 

    hashcode 和 equals 的具体实现方式  

    默认 equals 方法直接调用了 ==

    public boolean equals(Object obj) {

        return (this == obj);

    }

    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;

         }

    hashCode是根类Obeject中的方法。默认情况下,Object中的hashCode() 返回对象的32位jvm内存地址。也就是说如果对象不重写该方法,则返回相应对象的32为JVM内存地址。

    String类源码中重写的hashCode方法如下:

    public int hashCode() {

        int h = hash;    //Default to 0 ### String类中的私有变量,

        if (h == 0 && value.length > 0) {    //private final char value[]; ### Sting类中保存的字符串内容的的数组

            char val[] = value;

            for (int i = 0; i < value.length; i++) {

                h = 31 * h + val[i];

            }

            hash = h;

        }

        return h;

    }

    总结:

    (1)绑定。当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

    (2)绑定原因。Hashtable实现一个哈希表,为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。同(1),必须保证equals相等的对象,hashCode 也相等。因为哈希表通过hashCode检索对象。

    (3)默认。==默认比较对象在JVM中的地址。hashCode 默认返回对象在JVM中的存储地址。equal比较对象,默认也是比较对象在JVM中的地址,同==

  • 相关阅读:
    socket.io的抽象实现:engine.io
    Juicer javascript 模板引擎
    phonegap 开发案例
    安卓升级提示 phoneGap APK软件更新提示
    搭建Titanium开发环境
    phonegap WebApp
    vue-cli 配置vue项目环境笔记
    从一张表里面查询后十条数据的前七条
    js实现文字搬运工
    MySQL —— 数据库数据备份命令 mysqlump 的使用
  • 原文地址:https://www.cnblogs.com/wade-luffy/p/5820465.html
Copyright © 2020-2023  润新知