欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Object:equals()、hashCode()、toString()

程序员文章站 2022-04-19 18:24:17
...

Java中,Object类是所有类的祖宗,他们都直接或间接的继承了Object。如果一个类没有使用extends关键字继承另一个类,默认继承Object类。

Object类的几个重要方法:

1、equals()

废话不多说,直接看源码,

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

如果我们没有重写equals()的话,对象会调用到父类Object的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;
    }

2、toString()

该方法用于打印对象的字符串形式。

如果不重写toString方法,在打印对象的时候,会调用到Object类的toString方法,会打印对象地址。看源码:

    //Object中的toString()方法
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

String类重写了toString()方法

	public String toString() {
        return this;
    }

3、hashCode()

  •  同一个对象生成多次hash值,值一定是一样的
    
  •  不同对象,生成的值,可能相同,产生哈希冲突,需要用equals()方法,比较哈希值相同的对象的内容是否一样
    
  •  在java中可以通过 hashCode和equals来确定对象的唯一性
    

equals()与hashCode()的联系:

  • (1)由于Object类的equals()用来比较内存地址,如果两个对象的equals()结果为true,那么这两个对象的hashCode一定相同;
    
  • (2)两个对象的hashCode()结果相同,并不能代表两个对象的equals()一定为true,只能够说明这两个对象在一个散列存储结构中。
    
  • (3)如果对象的equals()被重写,那么对象的hashCode()也要重写。
    

为啥重写equals()就要重写hashCode() ?

以hashSet集合()为例,这个集合是不允许有重复元素的。如果我们只是重写了equals(),而没有重写hashCode() ,会导致集合元素不唯一。因为我们都是先根据hashCode()方法算出对象的哈希值,如果哈希值不同,肯定不是一个对象,也就不用equals()进行比较;如果哈希值相等,在用equals()判断内容是否相等。如果不重写hashCode(),两个对象的哈希值肯定不一样(Object类的hashCode()返回的对象内存地址永远不会相同),也就是这两个对象不在一个散列区域,都不需要equals()比较,就直接存进去了。