JavaSE——面向对象8:Object类详解(==与equals的区别、hashCode、toString方法)

目录

一、==与equals()的区别

(一)==是一个比较运算符

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

(三)equals方法重写练习

1.练习1

2.练习2

3.练习3

二、hashCode方法

三、toString方法

1.默认返回:全类名(包名+类名)+@+哈希值的十六进制

(1)不重写toString方法

(2)重写toString方法

2.当直接输出一个对象时,toString方法会被默认地调用 

四、getClass()

五、finalize关键字(开发中用得不多)


一、==与equals()的区别

(一)==是一个比较运算符

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

默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如Integer、String

Object类的equals源码:判断俩个对象的地址是否相同

System.out.println("hello".equals("abc")); // false// 即Object 的equals 方法默认就是比较对象地址是否相同
// 也就是判断两个对象是不是同一个对象.public boolean equals(Object obj) {return (this == obj);
}

Integer类的equals源码:判断值的内容是否相同

//从源码可以看到 Integer 也重写了Object的equals方法,
//变成了判断两个值是否相同
public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;
}Integer integer1 = new Integer(1000);
Integer integer2 = new Integer(1000);
System.out.println(integer1 == integer2);//false
System.out.println(integer1.equals(integer2));//true

String类的equals源码:比较两个字符串值是否相同。

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
}String str1 = new String("helloworld");
String str2 = new String("helloworld");
System.out.println(str1 == str2);//false
System.out.println(str1.equals(str2));//true

(三)equals方法重写练习

1.练习1

        应用实例:判断两个Person对象的内容是否相等,如果两个Person对象的各个属性值都一样,则返回true,反之false。

public class EqualsExercise01 {public static void main(String[] args) {Person p1 = new Person("zhangsan", 16, '男');Person p2 = new Person("zhangsan", 16, '男');System.out.println(p1.equals(p2)); // true}
}class Person {private String name;private int age;private char gender;// 重写equals方法public boolean equals(Object obj) {// 先判断地址是否相等if (this == obj) {return true;}if (obj instanceof Person) {// 向下转型,因为要取得obj中的各个属性Person p = (Person) obj;return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;}return false;}public Person(String name, int age, char gender) {this.name = name;this.age = age;this.gender = gender;}
}

2.练习2

public class EqualsExercise02 {public static void main(String[] args) {Person_ p1 = new Person_();p1.name = "hspedu";Person_ p2 = new Person_();p2.name = "hspedu";System.out.println(p1 == p2); // falseSystem.out.println(p1.name.equals(p2.name));// trueSystem.out.println(p1.equals(p2));// falseString s1 = new String("asdf");String s2 = new String("asdf");System.out.println(s1.equals(s2));// trueSystem.out.println(s1 == s2); // false}
}class Person_ {public String name;
}

3.练习3

int it = 65;
float fl = 65.0f;
System.out.println(it == fl); // true
char ch1 = 'A';
char ch2 = 12;
System.out.println(it == ch1); // true
System.out.println(12 == ch2); // true
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
// System.out.println("hello" = new java.sql.Date()); 编译报错

二、hashCode方法

  1. hashCode能够提高具有哈希结构的容器的效率,例如HashSet、LinkedHashSet、Hashtable
  2. 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
  3. 两个引用,如果指向的是不同对象,则哈希值是不一样的
  4. 哈希值主要是根据地址号来的!不能完全将哈希值等价于地址
  5. 在集合中也可能会需要重写hashCode
public class HashCode_ {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()=1163157884System.out.println("aa2.hashCode()=" + aa2.hashCode());// aa2.hashCode()=1956725890System.out.println("aa3.hashCode()=" + aa3.hashCode());// aa.hashCode()=1163157884}
}class AA {}

三、toString方法

基本介绍:

1.默认返回:全类名(包名+类名)+@+哈希值的十六进制

子类往往重写toString方法,用于返回对象的属性信息

Object类的toString方法的源码:

// (1)getClass().getName() 类的全类名(包名+类名 )
// (2)Integer.toHexString(hashCode()) 将对象的hashCode值转成16进制字符串public String toString() {return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
(1)不重写toString方法
public class ToString_ {public static void main(String[] args) {Monster monster = new Monster("小妖怪", "巡山的", 1000);System.out.println(monster.toString() + " hashcode=" + monster.hashCode());// 未重写toString方法的输出:// com.testdemo.object_.Monster@4554617c hashcode=1163157884       }
}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;}
}
(2)重写toString方法

        打印对象或拼接对象时,都会自动调用该对象的toString形式。

public class ToString_ {public static void main(String[] args) {Monster monster = new Monster("小妖怪", "巡山的", 1000);System.out.println(monster.toString() + " hashcode=" + monster.hashCode());// 重写了toString方法的输出:// Monster{name='小妖怪', job='巡山的', sal=1000.0} hashcode=1163157884}
}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// 重写后,一般是把对象的属性值输出,当然程序员也可以自己定制@Overridepublic String toString() { return "Monster{" +"name='" + name + '\'' +", job='" + job + '\'' +", sal=" + sal +'}';}
}

2.当直接输出一个对象时,toString方法会被默认地调用 

即:System.out.println(monster.toString());等价于  System.out.println(monster);

四、getClass()

Object类的getClass()方法可以返回此Object的运行时类。

代码示例:

注意:obj的编译类型是无法修改的,永远是AAA类。

public class HomeWork15 {public static void main(String[] args) {AAA obj = new BBB();AAA b1 = obj;System.out.println("obj的运行类型=" + obj.getClass()); // BBBobj = new CCC();System.out.println("obj的运行类型=" + obj.getClass()); // CCCobj = b1;System.out.println("obj的运行类型=" + obj.getClass()); // BBB        }
}class AAA {}class BBB extends AAA {}class CCC extends BBB {}

五、finalize关键字(开发中用得不多)

  1. 当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作。
  2. 什么时候被回收:当某个对象没有任何引用时,则JVM就认为这个对象时一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法。
  3. 垃圾回收机制的调用,是由系统来决定(即由自己的GC算法),也可以通过System.gc()主动触发垃圾回收机制。
public class Finalize_ {public static void main(String[] args) {Car bmw = new Car("宝马");// 这时 car对象就是一个垃圾,垃圾回收器就会回收(销毁)对象, 在销毁对象前,会调用该对象的finalize方法// 可以在 finalize中,写自己的业务逻辑代码(比如释放资源:数据库连接,或者打开文件..)// 如果不重写 finalize,那么就会调用 Object类的 finalize, 即默认处理// 如果重写了finalize, 就可以实现自己的逻辑bmw = null;System.gc();// 主动调用垃圾回收器System.out.println("程序退出了....");// 程序退出了....// 我们销毁 汽车宝马// 释放了某些资源...}
}class Car {private String name;//属性, 资源。。public Car(String name) {this.name = name;}//重写finalize@Overrideprotected void finalize() throws Throwable {System.out.println("我们销毁 汽车" + name);System.out.println("释放了某些资源...");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效、伤害等没有触发

UE5系列文章目录 文章目录 UE5系列文章目录前言一、问题分析二、解决方法1. 添加项目设置碰撞检测通道2.玩家角色碰撞设置3.怪物角色碰撞预设 最终效果 前言 在使用unreal engine5制作动作类游戏时,我们使用刀剑等武器攻击怪物或敌方单位时,发现攻击特效…

基于Hive和Hadoop的用电量分析系统

本项目是一个基于大数据技术的用电量分析系统,旨在为用户提供全面的电力消耗信息和深入的用电量分析。系统采用 Hadoop 平台进行大规模数据存储和处理,利用 MapReduce 进行数据分析和处理,通过 Sqoop 实现数据的导入导出,以 Spark…

Python中流行的开源OCR项目

以下是一些Python中流行的开源OCR项目: PaddleOCR:由百度开发的OCR工具库,支持多种语言的文字识别,包括中英文,同时支持倾斜、竖排等多种方向的文字识别。它提供了超轻量级的PP-OCRv3模型,适合在资源受限的…

`git restore` 和 `git checkout` 用于丢弃工作区的改动, `git switch` 和 `git checkout` 用来切换分支

git restore 和 git checkout 都可以用于丢弃工作区的改动 但它们有一些区别,尤其是在 Git 2.23 引入了新的命令后。 主要区别 git checkout 是一个多用途命令: 它用于切换分支。它还可以用于恢复工作区中特定文件的更改。由于功能过于复杂&#xff0c…

Flutter 3.24 AAPT: error: resource android:attr/lStar not found.

在Android build,gradle下面,添加右边红框的代码: subprojects {afterEvaluate { project ->if (project.plugins.hasPlugin("com.android.application") ||project.plugins.hasPlugin("com.android.library")) {project.androi…

【MySQL】SQL介绍+基础+DDL+数据备份+还原

目录 一、DDL建库建表 1. 数据库 2. 内部4特征 3. 外部4特征 4. 数据库结构 5. SQL语句分类(重点) 6. 注意 7. 数据库表的字段类型 8. 存储引擎 9. 数据库表的操作 二、三范式 1. 什么是范式 2. 约束作用 3. 三范式 4. 第一范式&#xff…

【Android 14源码分析】Activity启动流程-2

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

Visual Studio C# 编写加密火星坐标转换

Visual Studio C# 编写加密火星坐标转换 1、WGS84坐标转GCJ02火星坐标2、GCJ02火星坐标转WGS84坐标(回归计算)3、GCJ02火星坐标转BD09百度坐标4、BD09百度坐标转GCJ02火星坐标(回归计算)5、坐标公共转换类6、地图显示7、程序简单界…

检查jar冲突,查找存在相同class的jar

写在前面 本文看下如何查找jar冲突,即查找哪些jar包中存在相同的class。如果是存在相同jar的不同版本,基本一眼就能看出来,然后结合maven的依赖关系将其剔除掉即可,但是当你遇到了有人手动拷贝某些class到jar包中导致冲突的情况时…

【AI知识点】维度灾难(curse of dimensionality)

维度灾难(curse of dimensionality) 是指在处理高维数据时,随着维度的增加,数据的性质和空间结构变得越来越复杂,导致许多常见的算法和技术在高维空间中效率低下或效果变差的问题。 这个概念最早是由Richard Bellman在…

OpenCAEPoro安装与测试(ASC 2024)

首先简单总结一下经验: 在之前的测试和学习中,由于自己是虚拟机或者云服务器,有root权限,经常无脑增删文件(主要是为了图省事,看见报错就加回来,多出来就删除),但是在经…

Ubuntu Server 20.04 64bit定时备份MySQL8.0.36数据库数据

一、编写sh脚本 常见备份命令介绍 我选用的是mysqldump命令,命令使用简介 [root]> mysqldump -helpUsage: mysqldump [OPTIONS] database_name [tables] OR mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...] OR mysqldump [OPTIONS] --all…

python全栈学习记录(二十一)类的继承、派生、组合

类的继承、派生、组合 文章目录 类的继承、派生、组合一、类的继承二、派生三、组合 一、类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类。 继承的特性是:子类会遗传父类的属性(继承是类与类之间的关系&a…

程序猿成长之路之设计模式篇——设计模式简介

无论是对于代码质量还是代码可维护性、可扩展性,使用合适的设计模式都能够起到促进提升的作用,此外在软考的软件工程师、系统架构师职称考试中,设计模式也是必考的一块内容,因此我打算开拓一个新的专栏简单介绍一下设计模式&#…

腾讯一面-LRU缓存

为了设计一个满足LRU(最近最少使用)缓存约束的数据结构,我们可以使用哈希表(HashMap)来存储键值对,以便在O(1)时间复杂度内访问任意键。同时,我们还需要一个双向链表(Doubly Linked …

智慧水务可视化:高效管理水资源

利用图扑先进的可视化技术,实现对水资源的实时监控与高效管理,提高水务工作的透明度和决策效率,促进水资源的可持续利用。

太原网站制作打造企业网站的关键要素

太原网站制作:打造企业网站的关键要素 在数字化时代,企业网站成为了品牌形象和市场营销的重要一环。太原的企业在进行网站制作时,需要关注几个关键要素,以确保网站能够有效提升企业竞争力和用户体验。 **1. 目标明确** 在网站制…

利用Spring Boot打造新闻推荐解决方案

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

Elasticsearch 8.16 和 JDK 23 中的语言环境变化

作者:来自 Elastic Simon Cooper 随着 JDK 23 即将发布,语言环境信息中有一些重大变化,这将影响 Elasticsearch 以及你提取和格式化日期时间数据的方式。首先,介绍一些背景知识。 什么是语言环境? 每次 Java 程序需要…

资源《Arduino 扩展板4-单游戏摇杆》说明。

资源链接: Arduino 扩展板4-单游戏摇杆 1.文件明细: 2.文件内容说明 包含:AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程,采用AD做的。 该文件打板后配合Arduino使用,属于Arduino的扩展板。 该文件…