zoukankan      html  css  js  c++  java
  • Java之==和equals的区别、equals和hashcode

    如此老生常谈的问题,竟然还是很深奥。

    今天之前 我还是只知道==只能判断值是否相等  equals判断字符串、对象是否相等

    那么我们来看打脸时刻

     返回的是true啊 同学们 字符串是可以用==号判等的。

    但是我在项目里 登录模块 我输入的账号密码 要和数据库拿出来的账号密码进行一个对比。这时候就不能用== 必须用equals方法了。

    来看一下为什么。

    下面是string的equals源码(jdk8)

    先比较是否为同一对象,再每个字符的进行比较。

    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;
        }

    那么==是怎么进行比较的呢。

    在JVM有个方法区 里面有运行时常量池。

    这里面储存了各种基础数据类型、字符串常量等,我们假设有两个int值进行 而且两个都是100.==比较是相等的。这是因为对于100这个数我们开辟了内存 值为100 让a指向这个内存,b同样指向这个内存。

    上面两个字符串(注意是字符串常量 不能是new String这样是字符串对象)。方法区开辟了“aaaa”的内存,a和b都指向它。所以地址一样 ==返回true;

    1. == 比较的是两个对象在java虚拟机中的地址;
    2. equals 默认比较的也是两个对象在java虚拟机中的地址,但是我们可以对一个对象的equals方法进行重写,而“==”我们无法重写;

    我们在Java中有一个规律:对象相等 hashcode值肯定相等。两对象hashcode值相等 不一样两对象相等。

    所以当我们在创建新的类时 要重写二者方法。如果要重写equals必须要重写hashcode因为这样提升效率。

    hashcode是我们jvm的底层运算,速度很快,所以一般判等先判hashcode 在调用equals方法

    对于我们的接口

    Set区别对象是不是唯一的标准是,两个对象hashcode是不是一样,再判定两个对象是否equals;

    Map 是先根据Key值的hashcode分配和获取对象保存数组下标的,然后再根据equals区分唯一值(详见下面的map分析)

  • 相关阅读:
    graalvm 内置require 模块的开启
    Calling out from Java to JavaScript (with call back) – leveraging interoperability support of GraalVM
    web开发 api 资源跨域的一种实践
    使用rollup 转换commonjs 模块为es6 模块,方便的支持graalvm 模块兼容
    使用json-mask 查询json 数据
    nginx njs docker 试用
    使用nginx-prometheus-exporter 监控nginx
    wso2 关于graphql 的方案
    docker也一直发展
    操作系统-容器-Docker:如何将应用打包成为 Docker 镜像?
  • 原文地址:https://www.cnblogs.com/cckong/p/14489214.html
Copyright © 2011-2022 走看看