"==" equals和hashCode的联系和区别

写这篇文章的目的是自己彻底把三者搞清楚,也希望对你有所帮助。

1."=="运算符对与基本类型(int long float double boolean byte char short),比较的是他们的值。但是对于复合数据类型,比较的是他们的内存地址。

public class TestString {
    public static void main(String[] args){
        String s1="Hello";
        String s2="Hello";
        if(s1==s2){
            System.out.println("s1==s2");
        }else{
            System.out.println("s1!=s2");
        }
    }

}

运行结果 s1==s2

public class TestString {
    public static void main(String[] args){
        String s1=new String("Hello");
        String s2=new String("Hello");
        if(s1==s2){
            System.out.println("s1==s2");
        }else{
            System.out.println("s1!=s2");
        }
    }

}

运行结果 s1!=s2

分析:

当我们用String s1="Hello",再创建String s2="Hello"的时候,他会先去字符串缓冲池寻找相同的对象,因为我们之前创建了s1,s1被放在了字符串缓冲池中,

所以s2创建的时候,就找到了相同的值s1,s1和s2指向同一个对象。

当我们使用new的时候,就会新开辟一个内存地址,无论你怎么比较都不会相等的。

public class TestString {
    public static void main(String[] args){
        String s1="Hello";
        String s2=new String("Hello");
        if(s1==s2){
            System.out.println("s1==s2");
        }else{
            System.out.println("s1!=s2");
        }
    }

}

所以这个比较结果返回的也是s1!=s2,因为当我们用String s1="Hello"的时候,这个时候字符串缓冲池存在值Hello,但是接下来String s2=newString("Hello");他会怎么办呢,他会先去字符串缓冲池去找,如果池子没有Hello,他会在字符串缓冲池创建一个字符串常量“Hello”,如果存在就不在字符串缓冲池中创建。然后会在堆中创建一个新的对象(无论字符串缓冲池有没有都会执行)。所以说两者内存地址不相等。

2.equals是Object基类中的一个方法,java中所有的类都是继承Object 这个基类的。这个方法初始也是比较两者的内存地址的,这是原始的Object中的equals方法源码

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

很明显的看到方法里面的==,说明比较的是内存地址。

但是有一些类中有自身的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;
    }

解释:如果是对象类型直接比较内存地址,如果是String类型逐一比较内容值。

public class TestString {
    public static void main(String[] args){
        String s1="Hello";
        String s2=new String("Hello");
        if(s1.equals(s2)){
            System.out.println("s1==s2");
        }else{
            System.out.println("s1!=s2");
        }
    }

}

结果返回:s1==s2。

注意:那这样的代码又会返回什么结果呢?

public class TestString {
    public static void main(String[] args){
        String s1="Hello";
        String s2=new String("Hello");
        s2=s2.intern();
        if(s1==s2){
            System.out.println("s1==s2");
        }else{
            System.out.println("s1!=s2");
        }
    }

}

返回结果:s1==s2。为什么??答案:String#intern方法,这个方法是一个 native 的方法,“如果常量池中存在当前字符串, 就会直接返回当前字符串. 如果常量池中没有此字符串, 会将此字符串放入常量池中后, 再返回”。

3.hashCode方法也是从Object类中继承过来的,它是用来鉴定两个对象是否相等,Object类中的的hashCode返回的是对象在内存中地址转换成的一串int数值,如果没有重写hashCode方法,任何对象的hashCode都不会相等的。恰恰String的hashcode重写了,你说气人不。如果两个对象equals相等,则hashCode必须相等,反之不成立。一般来说你重写了equals,也要重写HasCode。

原文地址:https://www.cnblogs.com/yyfyl/p/10285363.html

时间: 2024-10-11 16:05:05

"==" equals和hashCode的联系和区别的相关文章

==、equals、hashCode区别?

[==.equals().hashCode()区别?] 1)== 运算符用来比较两个变量的值是否相等. 即该运算符用于比较变量对应得内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用"=="运算符. 2)equals 是Object类提供的方法之一. 每一个Java类都继承自Object类,所以每一个对象都具有equals这个方法. Object类中定义的equals(Object)方法是直接使用"=="运算符比较的两个对象,所以在没

java-“==”、equals和hashcode有什么区别

1)"=="运算符是比较两个变量的值是否相等.也就是说,该运算符用于比较变量对应的内存中所存储的值是否相等,要比较两个基础类型的数据或两个引用变量是否相等,只能使用"=="运算符. 具体而言,如果两个变量是基础类型,可以直接使用"=="运算符判断对应的值是否相等.如果一个变量指向的是对象(引用类型),那么,此时涉及两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如对于语句String s = new String(),变量s占用一

Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提高查询速度.(HashMap,HashSet等

equals()和hashCode()区别?

equals()和hashCode()区别? ------------------------------------------------- equals():反映的是对象或变量具体的值,即两个对象里面包含的值--可能是对象的引用,也可能是值类型的值. hashCode():计算出对象实例的哈希码,并返回哈希码,又称为散列函数.根类Object的 hashCode()方法的计算依赖于对象实例的D(内存地址),故每个Object对象的hashCode都是唯一的:当然,当对象所对应的类重写了 h

[转]Java中==和equals的区别,equals和hashCode的区别

在java中: ==是运算符,用于比较两个变量是否相等. equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样.Object的equals方法如下: [java] view plain copy public boolean equals(Object obj) { return (this == obj); } hashCode也是Object类的一个方法.返回一个离散的int型整数.在集合类操作中使用,为了提

Java 中的 ==, equals 与 hashCode 的区别与联系

一.概述 1.概念 == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系 equals : Object 的 实例方法,比较两个对象的content是否相同 hashCode : Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数 二.关系操作符 == 1.操作数的值 基本数据类型变量 在Java中有八种基本数据类型: 浮点型:float(4 byte), double(8 byte) 整型:byt

【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址

Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等.特别指出利用equals比较八大包装对象(如int,float等)和String类(因为该

java中的==、equals和hashCode区别

java中==.equals().hashCode()都和对象的比较有关. 关于== ==是容易理解的.java设计java就是要比较两个对象是不是同一个对象. 对于引用变量而言,比较的时候两个引用变量引用的是不是同一个对象,即比较的是两个引用中存储的对象地址是不是一样的. 对于基本数据类型而言,比较的就是两个数据是不是相等,没什么歧义. 由于对于基本数据类型而言,没有方法,所以不存在equal()和hashCode()的问题,下面的讨论都是针对引用类型而言的. 关于equals() 为什么ja