深入了解Java Object类的使用

news/2024/7/23 19:09:26 标签: java, 开发语言
目录
  • 1.equals方法
    • ==运算符
    • equals
  • 2.hashCode
  • 3.toString
  • 4.finalize

1.equals方法

==运算符

比较运算符,即可以判断基本类型又可以判断引用类型

如果判断基本类型,则判断值是否相等

如果判断引用类型,则判断地址是否相等,即判断是否为同一个对象

equals

是object类的一个方法,只能判断引用类型

object - equals源码:

?

1

2

3

public boolean equals(Object obj) {

    return (this == obj);

}

可以清晰的看到,object类里的equals方法是判断对象的地址是否相同(是不是同一个对象)

但是,其他数据类型类会重写equals方法,比如String类的重写:(判断两个字符串的值是否相等)

?

1

2

3

4

5

6

7

8

public boolean equals(Object anObject) {

    if (this == anObject) {

        return true;

    }

    return (anObject instanceof String aString)

            && (!COMPACT_STRINGS || this.coder == aString.coder)

            && StringLatin1.equals(value, aString.value);

}

实例:

?

1

2

3

4

String str1 = new String("hello");

String str2 = new String("hello");

System.out.println(str1 == str2); // false

System.out.println(str1.equals(str2)); // true

2.hashCode

提高具有哈希结构的容器的效率

两个引用如果指向同一个对象,哈希值肯定(不冲突的情况下)一样,反之不一样

哈希值根据地址而来但并非地址

演示:

?

1

2

3

4

5

6

7

8

// hashCode

A a = new A();

A a1 = new A();

A a2 = a;

System.out.println(a.hashCode());

System.out.println(a1.hashCode());

System.out.println(a2.hashCode());

------------------------------

输出:

1324119927
990368553
1324119927

3.toString

返回该对象的字符串表示

源码:

?

1

2

3

public String toString() {

    return getClass().getName() + "@" + Integer.toHexString(hashCode());

}

实例:

?

1

2

3

// toString

A a3 = new A("dahe",25,"安全服务工程师");

System.out.println(a3.toString());

输出:

classes.A@41629346
包名.类名@十六进制的hashCode

现在我们在类中重写一下toString方法(模板):

?

1

2

3

4

5

6

7

8

@Override

public String toString() {

    return "A{" +

            "name='" + name + '\'' +

            ", age=" + age +

            ", job='" + job + '\'' +

            '}';

}

再次运行上面的代码,现在输出如下:

?

1

A{name='dahe', age=25, job='安全服务工程师'}

另外,当我们直接输出对象时,会默认直接调用toString方法:

?

1

System.out.println(a3);

输出:

A{name='dahe', age=25, job='安全服务工程师'}

4.finalize

当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作

注意:在JDK18中。finalize被弃用了。它虽然可以帮助我们主动释放系统底层资源,但是说实话,没用过,Java 是自动管理内存的,使用它反而会导致潜在的系统安全风险,没帮助不说反而是负担,所以计划移除了。

实例:

?

1

2

3

4

5

// finalize

A a4 = new A("dh",33,"架构师");

a4 = null; // 这是a4成为了垃圾,垃圾回收器就会回收对象

// 在销毁对象之前,会调用对象的finalize方法

// 程序员就可以在这个方法中写入自己的业务,释放资源

重写finalize方法:

?

1

2

3

4

@Override

protected void finalize() throws Throwable {

    System.out.println("我们销毁对象");

}

除此之外,还可以主动运行垃圾回收器:

?

1

System.gc(); // 主动调用垃圾回收器


http://www.niftyadmin.cn/n/455186.html

相关文章

K - Summer Vacation

【题目描述】 有一次性的工作可用。如果您接受第 -份工作并完成它,您将从您完成工作的那天起获得几天后的奖励。Ni,Bi​,Ai​ 您一天最多可以接受并完成其中一项工作。 但是,您不能重新接受已经完成的工作。 找到您从今天起几天…

Cloud Studio 浏览器插件来啦

当谈到Cloud Studio浏览器插件的优势时,最显著的就是它的便捷性。通过安装Cloud Studio浏览器插件,用户可以在浏览器中直接打开Cloud Studio的开发环境,无需切换到其他应用程序,从而提高了开发效率。 另一个优势是插件对于Github…

Mybatis源码分析_日志模块 (1)

不得不承认,学习MyBatis的时间成本要比学习Spring低很多,Mybatis是我所了解过的代码量最小、整体架构最简单,但是又是最具有学习价值的一个框架。如果,你想快速的阅读一个框架的源码,并且掌握这个框架的精髓&#xff0…

locust学习教程(7) - docker运行单个locust脚本

目录 1、安装 docker 2、下载镜像 3、运行脚本 4、开始压测 🎁更多干货 1、安装 docker widnows安装docker客户端blog.csdn.net/weixin_4545… 实施步骤: 第一步、启动docker客户端 2、下载镜像 cmd窗口下载locust镜像文件:docker pul…

使用esp32+micropython+microdot搭建web(http+websocket)服务器(超详细)第三部分

使用esp32micropythonmicrodot搭建web(httpwebsocket)服务器(超详细)第三部分 microdot文档速查 什么是Microdot?Microdot是一个可以在micropython中搭建物联网web服务器的框架micropyton文档api速查 Quick reference for the ESP32 实现websocket服务…

slam中用到的Pangolin安装问题

sudo apt-get install libglew-dev sudo apt-get install cmake sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev cd ~/orbslam_ws/src$ git clone https://github.com/zzx2GH/Pangolin.git把Pangolin/src/CMakeLists.txt注释掉以下…

与反恐、反间谍科同级,美国国家安全部设立网络安全科

美国国家安全部(NSD)成立了一个新的网络部门,旨在能够更有力地应对高技术性的网络威胁。 这个新成立的部门,正式名称为国家网络安全科,是为了响应美国司法部 (DoJ) 2022 年全面网络审查中的核心…

DNDC模型四:土壤碳储量与作物产量、农田减排潜力分析

查看原文>>>双碳目标下DNDC模型建模方法及在土壤碳储量、温室气体排放、农田减排、土地变化、气候变化中的实践应用 由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。国家领导人在多次重要会…