当前位置: 首页 > article >正文

java学习记录05

Object类通用方法

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

Object的所有方法

native表示这个方法的实现是由其他语言(例如C或C++)编写的,它并不在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()方法源码

public boolean equals(Object obj) {
    return (this == obj);
}

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

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

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

Integer num1 = 256;
Integer num2 = 256;
System.out.println(num1 == num2); //false
System.out.println(num1.equals(num2)); //true

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

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等数据结构。

String s1 = "abc";
System.out.println(s1.hashCode()); //96354

equals()和hashCode()

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

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

//这里我重写了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()方法来简化计算过程。

 

 @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

 发现结果为1。

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

3.toString()

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

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()方法

@Override
protected Object clone() throws CloneNotSupportedException {
        return super.clone();
}

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

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

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


http://www.kler.cn/a/397369.html

相关文章:

  • 华为Ensp模拟器配置RIP路由协议
  • zabbix7.0实操指南:基于麒麟V10操作系统部署zabbix7.0
  • 群控系统服务端开发模式-应用开发-前端图片格式功能开发
  • Swift的可选绑定(Optional binding)
  • HBuilder(uniapp) 配置android模拟器
  • Spring Batch :高效处理海量数据的利器
  • 3271.哈希分割字符串
  • 第9章综合案例————众成远程教育
  • Vue中的导航守卫有哪三种?分别有什么作用
  • http.FileServer静态文件服务处理器和模板引擎使用
  • 洛谷p1781求调
  • 利用PyTorch的三元组损失Hard Triplet Loss进行嵌入模型微调
  • 十:详解HTTP的请求行
  • LeetCode 3239.最少翻转次数使二进制矩阵回文 I:遍历(行和列两种情况分别讨论)
  • w038基于SpringBoot的网上租赁系统设计与实现
  • 数据库事务介绍
  • 20241112-Pycharm使用托管的Anaconda的Jupyter Notebook
  • 周末总结(2024/11/16)
  • AJAX学习(24.11.1-24.11.14)(包含HTTP协议)
  • 管家婆工贸ERP BR039.采购订单关联MRP明细表
  • Blossom:开源私有部署的markdown笔记软件
  • Jarvis March算法详解及Python实现(附设计模式案例)
  • Rust 语言学习笔记(五)
  • 细粒度集群
  • Electron教程2-第一个应用
  • 在k8s上部署minio