java学习记录05

Object类通用方法

Object类是所有类的超类。如果在类声明中没有使用extends关键字明确指定超类,那么默认的超类就是Object类。这就意味着所有的对象(包括数组)都实现了该类的方法。

Object的所有方法

native表示这个方法的实现是由其他语言(例如C或C++)编写的,它并不在Java源代码中。

java 复制代码
public native int hashCode()

public boolean equals(Object obj)

protected native Object clone() throws CloneNotSupportedException

public String toString()

public final native Class<?> getClass()

protected void finalize() throws Throwable {}

public final native void notify()

public final native void notifyAll()

public final native void wait(long timeout) throws InterruptedException

public final void wait(long timeout, int nanos) throws InterruptedException

public final void wait() throws InterruptedException

1.equals()

Object的equals()方法源码

java 复制代码
public boolean equals(Object obj) {
    return (this == obj);
}

则对于没有重写equals的类,equals比较的是对象的地址值。

equals和==的区别
  • ==:如果比较的是基本数据类型,那么比较的是变量的值,如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)
  • equals:如果没重写 equals 方法比较的是两个对象的地址值,equals 方法是从 Object 类中继承的,默认的实现就是使用==。

Integer类重写了equals方法,比较值内容是否相等。

java 复制代码
Integer num1 = 256;
Integer num2 = 256;
System.out.println(num1 == num2); //false
System.out.println(num1.equals(num2)); //true

String类重写了equals方法,比较的是内容是否相同。

java 复制代码
String str1 = "name";
String str2 = new String("name");
System.out.println(str1 == str2);  //false
System.out.println(str1.equals(str2)); //true

2.hashCode()

hashCode()是一个由Object类发起并由Java系统原生支持的方法。它用于获取对象的哈希码,通常在散列算法中使用,如Java中的HashSet、HashMap等数据结构。

java 复制代码
String s1 = "abc";
System.out.println(s1.hashCode()); //96354

equals()和hashCode()

hashCode() 返回哈希值,而 equals() 是用来判断两个对象是否等价。等价的两个对象哈希值一定相同,但哈希值相同的对象值不一定相同。

在覆盖 equals() 方法时应当总是覆盖 hashCode() 方法,保证等价的两个对象哈希值也相等。

java 复制代码
//这里我重写了equals()方法,但没有重写hashCode()方法
TestClass tc = new TestClass("zhangsan",12);
TestClass tc2 = new TestClass("zhangsan",12);
boolean equals = tc.equals(tc2);
System.out.println(equals);  //true

//可以看到,被认为是两个对象,跟equals()结果出现不同
HashSet<TestClass> set = new HashSet<>();
set.add(tc);
set.add(tc2);
System.out.println(set.size()); //2

重写hashCode()方法,使用Java提供的Objects工具类的hash()方法来简化计算过程。

java 复制代码
 @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

发现结果为1。

java 复制代码
HashSet<TestClass> set = new HashSet<>();
set.add(tc);
set.add(tc2);
System.out.println(set.size()); //1

3.toString()

默认返回 day02.TestClass@34c45dca这种形式,其中@后面的数值为散列码的无符号十六进制表示。一般可以在类中重写toString方法,使得该类展示相关信息。

java 复制代码
TestClass tc = new TestClass();
String string = tc.toString();
System.out.println(string);  //day02.TestClass@34c45dca

4.clone()

clone() 是 Object 的 protected 方法,它不是 public,一个类不显式去重写 clone(),其它类就不能直接去调用该类实例的 clone() 方法。

可以看到没有clone()方法。

重写clone()方法

java 复制代码
@Override
protected Object clone() throws CloneNotSupportedException {
        return super.clone();
}

重写clone()方法后发现能够调用了,但是会弹出报错,这是因为没有实现Cloneable接口。

应该注意的是,clone() 方法并不是 Cloneable 接口的方法,而是 Object 的一个 protected 方法。Cloneable 接口只是规定,如果一个类没有实现 Cloneable 接口又调用了 clone() 方法,就会抛出 CloneNotSupportedException。

实现Cloneable接口后就没有报错了。

相关推荐
Brilliantwxx几秒前
【C++】stack_queue与deque模版(模拟实现+认识+对比)
开发语言·c++·笔记·算法·list
ch.ju1 分钟前
Java Programming Chapter 3——Subscript of the array
java·开发语言
雨落在了我的手上3 分钟前
初识java(三):运算符
java·开发语言
爱喝水的鱼丶4 分钟前
SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程(四篇连载)第四篇:ADT连接故障排查与环境迁移教程
运维·开发语言·数据库·学习·sap·abap
爱吃提升10 分钟前
Yifan Hu(适合大规模数据)大数据算法
开发语言·算法·php
Xpower 1710 分钟前
从PHM到AI Agent-如何用OpenClaw构建设备健康诊断智能体
网络·人工智能·学习·算法
c++之路14 分钟前
装饰器模式(Decorator Pattern)
java·开发语言·装饰器模式
Yolo566Q16 分钟前
环境土壤物理模型HYDRUS1D/2D/3D实践技术应用系统性学习
大数据·开发语言·gpt·学习·arcgis·r语言
金色光环17 分钟前
【DSP学习笔记】 F28335中断系统理解-基于普中DSP28335开发攻略
笔记·单片机·学习·dsp开发