`

equals( ) 和hashcode ()

阅读更多

今天看到一道面试题object对象包含哪些方法。
刚好没事看看呢看源码。
object对象包含方法大部分都为本地方法【使用C语言写的一些方法】,其中大部分是不可覆盖的;
本地方法中最重要的为

public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;

其他不常用的有
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final native Class<? extends Object> getClass();

类方法主要有
public boolean equals(Object obj)
public String toString()

方法就不一一介绍了,但这些方法中最让我注意到的是
public native int hashCode();
public boolean equals(Object obj)

为什么这两个会引起我注意,因为String对象运行的结果与其他对象运行的结果不一致。
对于对象来说equals代表的对象相等【及内存地址的相等】。
从源码中我们也可以看出是对象的比较。
 

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

 

但是我们总会问这样的问题。

String str1= "abc";
String str2= new String( "abc" );
System.out.println( str1.equals( str2 ) );//值为到底为什么。

 

也行你会说这为两个不同的对象为不等,因为对象的object的equals对象的比较,所以为false。
也行别人也会说告诉你的true,原因就是实验出来的。
到底结果如何,这里我们要注意对与object的equals方法,在子类中可以被覆盖的。
我们再看String的方法发现String对象覆盖object对象的equals方法

   public boolean equals(Object anObject) {
	//先比较对象是否相等
	if (this == anObject) {
	    return true;
	}
        //如果为String对象,比较String对象的字符串值
	if (anObject instanceof String) {
	    String anotherString = (String)anObject;
	    int n = count;
	    if (n == anotherString.count) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = offset;
		int j = anotherString.offset;
		while (n-- != 0) {
		    if (v1[i++] != v2[j++])
			return false;
		}
		return true;
	    }
	}
	return false;
    }

 

从源码中可以看出String对象的equals方法比较了对象,当对象不相等时再比较字符串的值;
可以看出上述的值为true。

hashcode()方法为获取对象的hash值【及对象的地址值】。

对于非重载的hashCode对象hashCode值一定不同,不一对象hashcode肯定不同
而对于String来说情况就不一样了,先看源码。
 

    public int hashCode() {
	int h = hash;
	if (h == 0) {
	    int off = offset;
	    char val[] = value;
	    int len = count;

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

 

发现时有字符串是有字符串中的值计算出来的,所以对于两个不同String对象,String字符串值相同时hashCode方法所得到的值是相同。

String str1= new String("abc");
String str2= new String("abc");
System.out.println( str1.hashCode() );
System.out.println( str2.hashCode() );

 

值都为96354

这里我们也要注意到对象基本类型的包装类如integer,Double,Float等都已经重载了hashcode及equals方法。

这里我列举integer的equals方法

    public boolean equals(Object obj) {
	if (obj instanceof Integer) {
	    return value == ((Integer)obj).intValue();
	}
	return false;
    }

 

这里我们发现它是先判断是否为integer类型然后再做数值比较

那我们看一下示例

Long l = new Long( 9 );
Integer i= new Integer( 9 );
Integer i1= new Integer( 9 );
		  
System.out.println(i.equals( 9 ));
System.out.println(i.equals( l ));
System.out.println(i.equals( i1 ));
System.out.println(i==9);
System.out.println(i==i1);
System.out.println(9==l);

    结果会怎么样

   从上面可以可以看出结果了

 

System.out.println(i.equals( 9 ));//true 
System.out.println(i.equals( l ));//false  l为long类型
System.out.println(i.equals( i1 ));//true
System.out.println(i==9);//true
System.out.println(i==i1);//false i与i1为不同的对象
System.out.println(9==l);//ture

 但是注意三个的hashcode是相同的

System.out.println(i.hashCode());//9
System.out.println(i1.hashCode());//9
System.out.println(l.hashCode());//9	

 

其实很多的东西只有看源码就能理解相应的原理及产生原因。所以有机会多看看java的底层源码。

分享到:
评论

相关推荐

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中的两个核心方法,所有类都默认继承自Object类。这两个方法在处理对象比较和集合操作时起着至关重要的作用。当我们创建自定义类并需要对对象进行精确...

    Java容器集合(equals 和 hashCode+基础数据结构+ArrayList+Vector和LinkedList)

    Java容器集合(equals和hashCode+基础数据结构+ArrayList+Vector和LinkedList) Java容器集合是Java中的一种基础数据结构,用于存储和管理数据。其中,equals和hashCode方法是Java容器集合中两个非常重要的方法,...

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    Java理论与实践:hashCode()和equals()方法

    本文还介绍了定义对象的相等性、实施equals()和hashCode()的需求、编写自己的equals()和hashCode()方法。通过统一定义equals()和hashCode(),可以提升类作为基于散列的集合中的关键字的使用性。

    Java中的equals和hashCode方法详解1

    在Java编程语言中,`equals()`和`hashCode()`方法是对象的基本组成部分,它们主要用于对象的比较和存储。这两个方法在`java.lang.Object`类中定义,因此所有的Java类都默认继承了这两个方法。然而,根据具体的应用...

    equals 和 hashCode两者效果分析详解.docx

    在Java编程语言中,`equals()`和`hashCode()`方法是两个非常重要的概念,尤其是在处理对象比较和容器(如HashMap和HashSet)操作时。这两个方法在Java的类库中有着核心地位,尤其是对于类实例的比较和存储。接下来,...

    关于Object中equals方法和hashCode方法判断的分析

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    深入理解equals和hashCode方法

    深入理解equals和hashCode方法 equals和hashCode方法是Java中Object类提供的两个重要方法,对以后的学习有很大的帮助。本文将深入剖析这两个方法,帮助读者更好地理解和使用它们。 equals方法 equals方法是用于...

    ordinary-zhang#java#equals和hashcode方法详解1

    1.概述 2.为什么重写equels方法要重写hashcode方法 3.例子

    equals,hashcode,toString

    在Java编程语言中,`equals()`, `hashCode()` 和 `toString()` 是三个非常重要的方法,它们主要用于对象的比较、哈希存储以及打印对象信息。这三个方法是Java对象的基础特性,对于理解和开发高质量的Java程序至关...

    Java equals 和 hashCode 的这几个问题可以说明白吗?.docx

    图文并茂吃透面试题,看完这个,吊打面试官,拿高薪offer!

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

    equals与hashCode方法讲解

    equals 方法和 hashCode 方法是 Java 语言中两个重要的方法,它们都是在 Object 类中定义的。equals 方法用于比较两个对象是否相等,而 hashCode 方法用于返回对象的哈希码。 在 Java 的 Object 类中,equals 方法...

    Java重写equals及hashcode方法流程解析

    Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将详细地介绍Java重写equals及hashCode方法的...

    equals-hashcode-processor-1.0.0.zip

    在Scala中,正确实现`equals`和`hashCode`方法对于集合操作至关重要,因为它们影响了对象在Set和Map中的存储和查找。这个处理器可能提供了一种自动化的方式来生成这些方法,避免了手动实现时可能出现的错误和不一致...

    学习Object类——为什么要重写equeals和hashcode方法

    Object 类的 equals 和 hashCode 方法的重要性与实现 在 Java 编程语言中,Object 类是所有类的父类,但是在实际开发中,我们往往需要重写 Object 中的 equals 和 hashCode 方法,以便正确地比较对象的逻辑内容,而...

    关于重写equals,hashcode以及compareTo方法!

    重写equals()、hashcode()和compareTo()方法是非常重要的,它可以使我们的程序更加高效、可靠和灵活。在实际开发中,我们需要根据具体情况来决定是否需要重写这些方法,并遵守相关的规则,以避免出现意想不到的结果...

    hashcode和equals方法

    equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

    java集合——Java中的equals和hashCode方法详解

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是Object类中定义的基本方法,所有类都默认继承自Object类,因此每个Java对象都有这两个方法。这两个方法在处理集合类,尤其是Set接口的实现(如HashSet)时起着...

Global site tag (gtag.js) - Google Analytics