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

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()比较,就直接存进去了。

扫描二维码关注公众号,回复: 12533611 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_41504815/article/details/112792072