17、Object类详解

1、equals方法

★★★==(比较运算符)和equals的对比(面试题)

(1)==:

1)既可以判断基本类型,又可以判断引用类型

2)如果判断基本类型,判断的是值是否相等。如果 int i=10;double d=10.0;

3)如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象

(2)equals方法

1)equals是Object类中的方法,只能判断引用类型

2)默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。

2、查看equals方法的源码

(1)Object中的equals方法

Object的equals方法默认就是比较对象地址是否相同,也就是判断两个对象是不是同一个对象

//Object类的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--!=v2[i]){//逐个比较字符
                if(v1[i]!=v2[i]){
                    return false;
                }
                i++;
            }
            return true;//如果两个字符串的所有字符都相等,则返回true
        }
    }
    return false;//如果比较的不是字符串,则直接返回false
}

(2)String中的equals方法

String类的equals方法把Object的equals方法重写了,变成了比较两个字符串值是否相同

 "hello".equals("abc");//查看String的equals方法的源码

(3)Integer中的equals方法

Integer类的equals方法把Object的equals方法重写了,变成了比较两个字符串值是否相同

Integer integer=new Integer(5);//查看Integer的equals方法的源码

package Equals;

public class Equals {
    public static void main(String[] args) {
        Integer integer1=new Integer(1);
        Integer integer2=new Integer(1);
        System.out.println(integer1==integer2);//false,因为是两个不同的对象
        System.out.println(integer1.equals(integer2));//true,因为是两个相同的值
        String str1=new String("hsp");
        String str2=new String("hsp");
        System.out.println(str1==str2);//false,因为是两个不同的对象
        System.out.println(str1.equals(str2));//true,因为是两个相同的字符串
    }
}

 

 

2、idea如何查看jdk源码

(1)一般来说idea配置好jdk后,jdk的源码也就自动配置好了,把光标放在方法处,快捷键Ctrl+B,即可查看该方法的源码 

 (2)如果没有:

File--->Project Structure--->SDKs--->Sourcepath--->点击右侧绿色的加号 --->添加两个jdk的源码包即可

 3、如何重写equals方法

package Equals;

import PolyArray.Person;

public class equals02 {
    public static void main(String[] args) {
        Person02 person1=new Person02("jack",18,'男');
        Person02 person2=new Person02("jack",18,'男');
        /*重写equals方法前
        System.out.println(person1.equals(person2));//输出:false
        因为Person extends Object,而Object中的equals方法是判断两个对象是否是同一个对象
         */
        //重写equals方法后
        System.out.println(person1.equals(person2));//输出:true
    }
}
class Person02 {
    private String name;
    private int age;
    private char gender;
    public boolean equals(Object obj){//obj指的是person2,this指的是person1
        if(this==obj){//判断比较的两个对象是否是同一个对象
            return true;
        }
        if(obj instanceof Person02){//都是Person类才比较,如果不同类比较没有意义
            Person02 p=(Person02)obj;//向下转型,p指的是person2
            return this.name.equals(p.name)&&this.age==p.age&&this.gender==p.gender;
        }
        return false;
    }

    public Person02(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    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 char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }
}

4、练习题

(1)

package Equals;
public class EqualsExercise {
    public static void main(String[] args) {
        Person p1=new Person();
        p1.name="hsp";
        Person p2=new Person();
        p2.name="hspdu";
        System.out.println(p1==p2);//false,比较两个对象的地址
        System.out.println(p1.name.equals(p2.name));//false,String的equals方法比较的是字符串的值
        System.out.println(p1.equals(p2));//false,Person是Object的子类,比较的是地址
        String s1=new String("asdf");
        String s2=new String("asdf");
        System.out.println(s1.equals(s2));//true,值相同
        System.out.println(s1==s2);//false,不是同一个对象
    }
}
class Person{
    public String name;
}

(2)

package Equals;
import java.sql.*;
public class EqualsExercise03 {
    public static void main(String[] args) {
        int it=65;
        float f1=65.0f;
        System.out.println("65和65.0f是否相等?"+(it==f1));//true,比较的是基本数据类型的值
        char ch1='A';
        char ch2=12;
        System.out.println("65和'A'是否相等?"+(it==ch1));//true,字符‘A’的ASCII码等于65
        System.out.println("12和ch2是否相等?"+(12==ch2));//true
        String str1=new String("hello");
        String str2=new String("hello");
        System.out.println("str1和str2是否相等?"+(str1==str2));//false,两个不同的对象
        System.out.println("str1是否equals str2?"+(str1.equals(str2)));
        //true,String重写Object类中的equals方法,比较的是值
        System.out.println("hello"==new java.sql.Date());
        //等号左边是字符串,右边是Date,类型不相同,无法比较,编译器报错
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戏拈秃笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值