zoukankan      html  css  js  c++  java
  • ==和equals以及hashcode

    1.==是操作符,不管是基本类型还是复合类型,永远是用来比较内存中的地址的。

    基本类型都是存在栈里面的(基本类型的成员变量还是存在堆里的),Int a=3;当你int b=3的时候,jvm会干嘛呢?首先,它会去栈里面找是不是已经有一个数据为3了。如果不是的话新建一个地址,是的话,就把b指向这个地址,所以对于基本类型来说,当值相同的时候,地址也是相同的,所以当你对基本类型==的时候,内容相同的肯定返回的是true。。因为实质上,他们的地址也是相同的
    但是对于其他类型,都是存在堆里面的动态分配内存,所以每一次新建一个数据都会动态分配一个内存地址,所以==的时候,当然内存地址是不一样的。
    要记住,==永远是用来比较内存中的地址的,基本类型感觉上是在比较内容,实际上还是在比较地址!

    2.equals是Object的方法,直接应用了==,由于是对象的方法,只能判断对象,不能被基本类型变量使用。要想实现不同的equals功能可以对其进行重写,比如String类对equals重写来比较字符串的内容。

    3.hashcode也是Object的方法,不能被基本类型调用。基于内存地址返回一个不固定位数的int型整数。同一个对象的hashcode一定是一样的。不同对象的hashcode也可能一样(产生哈希碰撞),因此不直接拿来判断两个对象是否相同。

    hashmap中因为key要求逻辑上的不重复,所以需要重写equals方法。(String类型已经重写过了)。又因为获取key的时候需要用到hahcode,你存进去一个key-value,获取目标的时候需要重新创建key来根据key进行获取时hashcode往往是不同的(除非恰好发生哈希碰撞),因此找到的元素的位置往往也是不同的(除非类似于1和17都对16取余余数相同了)。(String不需要重写是因为相同内容的string实际只会创建一个,因此hashcode也实际只有一个)?????string是final型的为什么还需要重写??(因为你不确定相同的内容是来自常量池还是来自堆)

    String重写equals方法源码:

    一:先直接用==判地址是否相同,相同直接返回true

    二:将目标String对象转为char数组,挨个比较每个数组的元素值是否相同,不同返回false否则返回ture。

    public boolean equals(Object anObject) {
    /**
    * 首先比较两个字符串地址值是否相等,相等说明是同一个字符串,直接返回true
    */
    if (this == anObject) {
    return true;
    }
    /**
    * 判断此字符串是否是String类型,不是返回false,是执行if语句进行判断
    */
    if (anObject instanceof String) {
    String anotherString = (String) anObject;
    /**
    * 字符串底层存储的是字符数组,value为数组名,所以其长度为value.length,赋值给int类型的变量n
    */
    int n = value.length;
    /**
    * 判断传入的字符串长度是否相等,anotherString对象调用成员变量char类型的value数组,调用得到value数组长度
    */
    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;
    }

    新生的小心情
  • 相关阅读:
    如何设置eclipse默认打开文件方式
    CalendarUtil.java
    排班管理
    jquery ajax 发送邮件例子
    C# 打开文件夹和保存文件夹
    C# QQ邮箱授权码发送邮件
    IIS7 http自动跳转到https
    C# 关键字替换
    C# webBrowser 控件赋值
    C# Post提交数据
  • 原文地址:https://www.cnblogs.com/jianmianruxin/p/7675684.html
Copyright © 2011-2022 走看看