"==",hashcode和equals方法的区别

“==”,hashcode()和equals()方法的区别

1.什么是“==”

"= ="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。

public static void main(String[] args) {
		String s1 = "a";
		String s2 = s1 + "b";
		String s3 = "a" + "b";
		String s4 = s1 + "b";
		String s7 = "a";
		String s5 = new String("a");
		String s6 = new String("a");
		System.out.println(s2 == "ab");//false
		System.out.println(s3.equals(s4));//true
		System.out.println(s1 == s5);//false
		System.out.println(s6 == s5);//false
		System.out.println(s1 == s7);//false
	}

2.什么是hashcode()

hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值,也就是哈希码,哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。在Java中,哈希码代表对象的特征。

public static void main(String[] args) {
		String s1 = "abc";
		int i1 = s1.hashCode();
		String s2 = "bbb";
		int i2 = s2.hashCode();
		String s3 = "abc";
		int i3 = s3.hashCode();
		System.out.println(i1);//96354
		System.out.println(i2);//97314
		System.out.println(i3);//96354
	}

不同的对象有不同的哈希码算法例如:
1、Object类的hashCode返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2、String类的hashCode根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
3、Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如:
Integer i1=new Integer(100);
i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。
由此可以看出Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的 字段等)映射成一个数值,这个数值称作为散列值。

3.什么是equals()

其他类型的对象进行比较时,equals方法默认的原理是判断两者的内存地址是否相同,所以默认情况下与= =操作符返回的结果相同,但是这里应该发现差别,也就是equals方法可以被重写—用户可以定制自己的equals方法,而==操作符不能被重写

Object中equals()方法

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

在Object这个类里面提供的equals()方法默认的实现是比较当前对象的引用和你要比较的那个引用它们指向的是否是同一个对象,例如比较流行的面试问题equals和==的区别,在object中两者是相等的都是对一个对象的指向进行比较。但是在String中对其进行了重写:

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中就变成了对值的比较,比较两者的value是否相等。
一般我们在设计一个类时,需要重写父类的equals方法,在重写这个方法时,需要按照以下几个规则设计:

  1. 自反性:对任意引用值X,x.equals(x)的返回值一定为true.
  2. 对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;
  3. 传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true
  4. 一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变
  5. 非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

你可能感兴趣的:(equals,hashcode,==)