详解Equals方法与“==”
这是代码:
package zz.itheima.equals;
//动物类
public class Animal {
/** * 1.equals方法来自object类,作用是对象(引用类型)之间的相等(值相等)判断 * 2.对象之间比较的内容是所有的属性值 * 3.自定义的类必须重写equals方法 */
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Animal(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Animal() {
super();
}
//equals方法重写(自己写)
public boolean equals(Object o){
//1.如果两个对象的内存地址一样或者说堆内存地址一样就无需比较属性值,肯定是同一个对象
//2、this代表当前对象,这里代表animal,==比较的就是对象之间的内存地址是否一样
if (this==o) {
return true;
}else {//内存地址不一样
if(o instanceof Animal){//必须保证传进来的对象类型和自身类型是同一种类型才有比较意义
//接下来就需要比较所有的属性值是否全部相同
Animal other = (Animal)o;//向下转型
if (this.name.equals(other.getName())&&this.age==other.getAge()) {
return true;
}else {
return false;
}
}else {//如果连类型都不一样那么就没有比较意义
return false;
}
}
}
}
package zz.itheima.equals;
//书类
public class Book {
private String name;
private double price;
private int isbn;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getIsbn() {
return isbn;
}
public void setIsbn(int isbn) {
this.isbn = isbn;
}
public Book(String name, double price, int isbn) {
super();
this.name = name;
this.price = price;
this.isbn = isbn;
}
public Book() {
super();
}
//重写hashcode
public int hashCode(){
return isbn + name.hashCode() + (int )price;
}
//重写toString方法
public String toString(){
return "isbn" + isbn + "书名:" + name + "价格:" + price;
}
}
package zz.itheima.equals;
public class TestAnimal {
public static void main(String[] args) {
/** * 1.==比较的是内存地址是否一样,基本类型如果值相等的话内存地址是一样的,所以基本类型做相等判断可以使用==,引用类型却不能, * 即便是值相等,地址却并不一定相等,但是地址相等一定能保证值相等。 * */
int j1 = 10;
int j2 = 10;
Animal a1 = new Animal();
a1.setName("a");
Animal a2 = new Animal();
a2.setName("a");
Animal a3 = a1;
System.out.println(j1==j2);//地址一样所有为true;
System.out.println(a1==a2);//a1和a2是两个对象,地址不一样,所以为false
System.out.println(a1==a3);//把a1地址直接赋值给a3,所以为true
System.out.println(a1.equals(new Book()));//不是同一种类型所以为false;
}
}
package zz.itheima.equals;
public class TestBook {
public static void main(String[] args) {
//测试hashcode
Book b1 = new Book("aaa", 10.0, 1);
Book b2 = new Book("aaa", 10.0, 1);
System.out.println(b1.hashCode());//两者相等
System.out.println(b2.hashCode());//hashcode算法就是把对内存地址进行处理(类名@处理后的哈希码),自定义类需要重写hashcode。
}
}
//得到某一个对象的类型
package zz.itheima.equals;
public class TestGetCalss {
public static void main(String[] args) {
// 得到某一个对象的类型
Book b = new Book();
Class c = b.getClass();
System.out.println(c.getName());//得到对象的类名:zz.itheima.equals.Book
}
}
//测试toString方法
package zz.itheima.equals;
public class TesttoString {
public static void main(String[] args) {
//测试toString()方法
Animal animal = new Animal();
System.out.println(animal);//直接输出一个对象默认的就是类名@哈希码。
}
}