Java常用类-Object(8个未完待续...)

Java Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法

Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。


1 equals方法

Object equals() 方法用于比较两个对象是否相等。

equals() 方法比较两个对象,是判断两个对象引用指向的是同一个对象,即它只是检查两个对象是否指向内存中的同一个地址

**注意:**如果子类重写了equals() 方法,就需要重写hashCode();比如 String 类重写了 equals() 方法,同时也重写了 hashCode() 方法。

语法:object.equals(Object obj)

String重写equals方法:

java 复制代码
public boolean equals(Object anObject) {
    if (this == anObject) {//如果是同一个对象
        return true;//返回 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;//如果两个字符串的所有字符都相等, 则返回 true
        }
    } 
    return false;//如果比较的不是字符串, 则直接返回 false
}

2 类中重写equals方法

java 复制代码
/**
 * @ClassName EqualsMethodTest
 * @Description
 * @Date 2024/11/25 21:24
 * @Version V1.0
 */
public class EqualsMethodTest {
    public static void main(String[] args) {
        Person p1= new Person("小明",18,true);
        Person p2= new Person("小华",18,false);
        Person p3= new Person("小明",19,true);
        Person p33= new Person("小明",19,true);
        System.out.println(p3.equals(p33));//true
        p33.setAge(20);
        System.out.println(p1.equals(p2));//false
        System.out.println(p3.equals(p33));//false
    }
}
class Person{
    private String name;
    private int age;
    private boolean gender;
    public Person(String name,int age,boolean gender){
        this.name=name;
        this.age=age;
        this.gender=gender;
    }
    @Override
    public boolean equals(Object obj) {
        if(this==obj) return true;//同一个对象,直接返回
        if(obj instanceof Person){//是Person,才比较
            Person p = (Person) obj;
            return this.name==p.name&&this.age==p.age&&this.gender==p.gender;
        }
        return false;//不是person,返回false
    }

    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 boolean isGender() {
        return gender;
    }

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

3 HashCode

public int hashCode()

返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。

hashCode 的常规协定是:

  • 在Java 应用程序执行期间,在对同一对象多次调用 hashcode 方法时,必须一致地返回相同的整数,前提是将对象进行 eqa1s 比较时所用的信息没有被修改。从某一应用程序的次执行到同一应用程序的另一次执行,该整数无需保持一致。
  • 如果根据 equals(Object)方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashcode 方法都必须生成相同的整数结果。
  • 如果根据 equals(java.lang. object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashcode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由Object 类定义的 hashcode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 Java不需要这种实现技巧。)

return:此对象的一个哈希码值。

  • 提高具有哈希结构的容器的效率!
  • 两个引用, 如果指向的是同一个对象, 则哈希值肯定是一样的!
  • 两个引用, 如果指向的是不同对象, 则哈希值是不一样的
  • 哈希值主要根据地址号来的,不能完全将哈希值等价于地址。
  • 集合中hashcode可以重写一下
java 复制代码
package day111;

/**
 * @ClassName HashCodeTest
 * @Description
 * @Date 2024/11/25 22:00
 * @Version V1.0
 */
public class HashCodeTest {
    public static void main(String[] args) {
        AA aa = new AA();
        AA aa2 = new AA();
        AA aa3 = aa;
        System.out.println("aa.hashCode()=" + aa.hashCode());//aa.hashCode()=793589513
        System.out.println("aa2.hashCode()=" + aa2.hashCode());//aa2.hashCode()=824909230
        System.out.println("aa3.hashCode()=" + aa3.hashCode());//aa3.hashCode()=793589513
    }
}
class AA{}

4 toString

复制代码
public String toString()
返回该对象的字符串表示。通常,toString方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object类的toString方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@
”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
return:该对象的字符串表示形式。
java 复制代码
package day111;

/**
 * @ClassName toStringTest
 * @Description
 * @Date 2024/11/25 22:04
 * @Version V1.0
 */
public class toStringTest {
    public static void main(String[] args) {
    /*
    Object 的 toString() 源码
        (1)getClass().getName() 类的全类名(包名+类名 )
        (2)Integer.toHexString(hashCode()) 将对象的 hashCode 值转成 16 进制字符串
        public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
    */
        Monster monster = new Monster("小妖怪", "巡山的", 1000);
        System.out.println(monster.toString() + " hashcode=" + monster.hashCode());
        System.out.println("==当直接输出一个对象时, toString 方法会被默认的调用==");
        System.out.println(monster); //等价 monster.toString()}
    }
}

class Monster {
    private String name;
    private String job;
    private double sal;

    public Monster(String name, String job, double sal) {
        this.name = name;
        this.job = job;
        this.sal = sal;
    }

    //重写 toString 方法, 输出对象的属性
    //使用快捷键即可 alt+insert -> toString
    @Override
    public String toString() { //重写后, 一般是把对象的属性值输出, 当然程序员也可以自己定制
        return "Monster{" +
                "name='" + name + '\'' +
                ", job='" + job + '\'' +
                ", sal=" + sal +
                '}';
    }
}
相关推荐
翀哥~2 分钟前
python VS c++
开发语言·c++·python
《源码好优多》8 分钟前
基于Java Springboot汽配销售管理系统
java·开发语言·spring boot
小林想被监督学习33 分钟前
Java后端如何进行文件上传和下载 —— 本地版
java·开发语言
Erosion202041 分钟前
SPI机制
java·java sec
猪猪虾的业余生活44 分钟前
matlab实现,数据曲线毛刺光滑
开发语言·matlab
HABuo1 小时前
【数据结构与算法】合并链表、链表分割、链表回文结构
c语言·开发语言·数据结构·c++·学习·算法·链表
逸风尊者1 小时前
开发也能看懂的大模型:RNN
java·后端·算法
望获linux1 小时前
在 ARM 平台上如何实现Linux系统的1秒启动
linux·服务器·开发语言·数据库·操作系统·嵌入式操作系统·arm平台
带多刺的玫瑰1 小时前
Leecode刷题C语言之网络延迟时间
c语言·开发语言·算法
尘浮生1 小时前
Java项目实战II基于Java+Spring Boot+MySQL的智能停车计费系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·mysql·微信小程序·maven