由Equals与==的区别所引发的问题

1、equals与==的区别

(1)如果通过String str = "kingsea"这样对String变量赋值,两种方式比较的结果是一样的。因为这样赋的内容一样时,系统就会直接从地址池里取出“kingsea”给str2,所以str1与str2的地址是一样的。但是如果通过String str = new String("Kingsea");这样对String对象赋值,两种比较的结果就不一样了。如果赋的内容一样,用==比较多结果是false,用equals比较的结果是true。如果赋的内容不一样,==与equals比较的结果都是false。这是因为new出了个新对象,系统就得为他俩都分配地址。这样他俩的地址是不一样的,但内容还是一样的。

所以可以理解为==比较的是地址,equals比较的是内容。但是这样的话,下面就有问题出现了,请看下面。

(2)我新建了个Person类如下

public class Person{
	public String name;
	public int age;
	public Person(String name,int age){
	this.name = name;
	this.age = age;
	}
}	


我new两个对象:Person person1 = new Person("Kingsea";22);Person person2 = new Person("Kingsea";22);然后用==和equals比较,可是结果却都为false;这是为什么呢?后来发现了原来String这个类里的equals方法已经重写过了。而我建的Person类没有重写。所以结果是不一样的。

(3)总结:==比较的是地址,equals比较的是内容,这样理解一般不错,但是得在equals已经重写的前提下。所以下面请看equals如何重写。

2、equals方法的重写

可以通过eclipse自动写这个方法,也可以自己去写。具体内容为: 

@Override
public boolean equals(Object obj) {
	if (this == obj)
		return true;
	if (obj == null)
		return false;
	if (getClass() != obj.getClass())
		return false;
	Persong other = (Person) obj;
	if (name != other.name)
		return false;
	if (age != other.age)
		return false;
	return true;
}


3、hashCode方法的重写

重写equals时也必须得重写hashCode方法,这个也可以通过eclipse自动写这个方法,也可以自己去写。具体内容为:

@Override
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + x;
	result = prime * result + y;
	return result;
}


4、意外发现toString方法的重写

这个也可以通过eclipse自动写这个方法,也可以自己去写。具体内容为:

@Override
public String toString() {
	return "Demo [name=" + name + ",age = " + age + "]";
}


你可能感兴趣的:(Java篇,equals,hashcode,string)