java中的equal 详解override equal

110 阅读1分钟

> Java中String相同字符串的地址是否相同??

在Java执行时会维护一个String池(pool),对于一些可以共享的字符串对象,会先在String池中查找是否存在相同的String内容(字符相同),如果有就直接返回,不创建新对象。 s2中的值是引用的s1的值,自己并没有创建对象,所以比较后的结果是true。


String s1="jj";
String s2="jj";
System.out.println(s1==s2); //true

String类型中equal比较 两个字符串值是否相等 是因为String底层重写了equal()

System.out.println(s1.equal(s2)); //true

equal:

Student stu1=new Student(22,"jay");//创建两个成员属性值相同的对象
Student stu2=new Student(22,"jay");

System.out.println(stu1.equals(stu2)); // false 
 //Object父类中equal 比较的是两个对象的内存地址是否相同 
 //如果要使用equal 比较两个对象的成员属性值 需要重写equal
 
//java底层Object中的equal()方法
public boolean equals(Object obj) {
         return (this == obj); //this是stu1
    }

重写equal:

public boolean equal(Object obj){
//比较内存地址是否相同 相同返回true
    if(this==obj){
        return true;
    }
//判断obj的值是否为空以及两个比较两个类型是否相同    
        if(obj==null||this.getClass()!=obj.getClass()){
            return false;
        }
//这个地方需要强转 因为传过来的是Object对象 不然获取不了stu2的成员属性值 
//如果将传过来的Object改为Student 则无需强转
        Student stu2=(Student) obj;
        return this.age==stu2.age&&this.name.equal(stu2.name);//比较成员属性值
}
System.out.println(stu1.equals(stu2)); //重写equal之后 true