一道经典的Java面试题:equals ,== 和hashcode()的区别

==

对于基本类型是值比较,对于引用类型来说是引用比较。

    /**
     * == 的比较
     */
    @Test
    public void testOne(){
        int a = 200;
        int b = 200;
        Integer c = 200;
        Integer d = 200;
        //值比较
        System.out.println(a == b);//同基本类型同值比较:true
        //引用类型比较
        System.out.println(c == d);//false
    }

equals

equals是原始类Object的方法,即所有对象都有equals方法,默认情况下(即没有重写)是引用比较,但是JDK中类很多重写了equals方法(一般是先进行 == 比较,再判断是否要进行值比较),所以一般情况下是值比较,注:基本类型不能使用equals比较,而是用 == ,因为基本类型没有equals方法.

先看看Obeject重写的equals方法:

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

 //Integer :
 //先判断是否为同一类型,不是直接false,是的话在进行值比较
public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

//String:
//先比较地址,然后判断是否为同一类型,不是直接false,是的话在进行值比较
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;
    }

equals的比较

class Cat{
    String name = "cat";
}
class Dog{
    String name = "dog";
}
________________________________________________________________________
    /**
     * euqals 比较
     */
    @Test
    public void testTwo(){
        int a = 200;
        int b = 200;
        Integer c = 300;
        Integer d = 300;
        Cat cat = new Cat();
        Dog dog = new Dog();
        System.out.println(c.equals(a));//false
        System.out.println(c.equals(d));//true
        //System.out.println(a.equals(cat));//基本类型不能使用equals比较,而是用==,因为基本类型没有equals方法
    }

hashcode()

hashcode()也是Object的方法,是一个本地方法,用C/C++语言实现的,由java去调用返回的对象的地址值。但JDK中很多类都对hashcode()进行了重写。比如Boolean的表示true则哈希值为1231,表示false则哈希值为1237,

    //Object:
    public native int hashCode();

    //Integer直接返回值
    public int hashCode() {
        return Integer.hashCode(value);
    }
    public static int hashCode(int value) {
        return value;
    }

    //String 返回此字符串的哈希码。
    public int hashCode() {
        int h = hash;
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            hash = h;
        }
        return h;
    }

hashcode()的简单使用

class Cat{
    String name = "cat";
}
class Dog{
    String name = "dog";
}
---------------------------------------------------------------------
    @Test
    public void testThree(){
        Cat cat = new Cat();
        Dog dog = new Dog();
        System.out.println(cat.hashCode());//204349222
        System.out.println(dog.hashCode());//231685785
        Integer a = 200;
        Integer b = 300;
        System.out.println(a.hashCode());//200
        System.out.println(b.hashCode());//300
    }

equals 与 == ,hashcode()的比较

  1. equal()相等的两个对象他们的hashCode()肯定相等。
  2. hashCode()相等的两个对象他们的equal()不一定相等。

可以尝试使用联想法去记住以上概念。比如我们使用的HashMap。其结构如下:

hashcode()相等,那么它们具有 相同的桶的位置,此时就如Entry1和Entry2,但是,Entry1和Entry2的equals并不一定想等,这是再举个例子Entry1=abc,Entry2=abc,那么它们是相等的,但是Entry1=abc,Entry2=def,那么它们是不相等的.
equals相等,那么说明它们在同一列上,那意味着桶的位置一样,则.hashCode()肯定相同

原文地址:https://blog.51cto.com/14226230/2422689

时间: 2024-10-12 20:12:52

一道经典的Java面试题:equals ,== 和hashcode()的区别的相关文章

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的区别详解

一.相同点 都是用来进行值或对象的比较. 二.不同点 对于“==”而言,对于基本类型(char,byte,short,int,long,float,double,boolean),对比的是值,所以是相等的,对于引用对象,对比的是引用的对象的堆地址,例如: public class Main { public static void main(String[] args) throws InterruptedException { Object obj1 = new Object(); Objec

10个经典的Java面试题

这里有10个经典的Java面试题,也为大家列出了答案.这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之后一定会有所提高.让我们一起来看看吧. 1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 get ()方法储存和获取对象.当我们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,让后

100多道经典的JAVA面试题及答案解析

面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码的可理解性. 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象.下面的章节我们会逐个分析这些特性. 封装 封装给对象提供了隐藏内部特性和行为的能力.对象提供一些能被其他对象访问的方法来改变它内部的数据.在Java当中,有3种修饰符:public,private和protected.每一种修

看Java中==、equals、hashCode的来龙去脉

我有一个哥们去参加了面试,面试官这样问一个Java问题: 你说一下java对象的equals方法调用什么方法呢?我这个哥们想了想,回答说"应该是比较的引用".听了这个答案之后,那个面试官摇头晃脑的说:"不对,你回答的不对,equals方法调用的是hashCode方法".于是乎,我那个技术还不错的哥们就悲壮地栽在这道题目上了. 今天晚上,西安历史上少有的热,那就好好总结一下这个题目的来龙去脉好了,也方便给后面的朋友们提个醒,不要栽在这么简单的问题上.你说这个面试官回答

Java中的equals和hashCode方法

本文转载自:Java中的equals和hashCode方法详解 Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法. equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复.这里我们首先要明白一个问题: equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的h

java中 == 和equals的使用与区别

java 的数据类型分为“基本数据类型” 和“引用数据类型”:   --->在基本数据类型的比较中,== 比的就是基本数据类型变量中所保存的值. --->在引用数据类型的比较中,== 才比较的是变量所指向的对象的地址. hashCode()返回该对象的哈希码值,该值通常是一个由该对象的内部地址转换而来的整数,它的实现主要是为了提高哈希表. 我们以引用数据类型为例,因为基本类型比较的是值,简单无须多言. 封装好的String 类型为例: (注意:ObjectL中有方法equals, hashco