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.rhkb.cn/news/439101.html

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

相关文章

初识Django

前言: 各位观众老爷们好,最近几个月都没怎么更新,主要是最近的事情太多了,我也在继续学习Django框架,之前还参加了一些比赛,现在我会开始持续更新Django的学习,这个过程会比较久,我会把我学习的…

微积分-反函数6.5(指数增长和衰减)

在许多自然现象中,数量的增长或衰减与其大小成正比。例如,如果 y f ( t ) y f(t) yf(t) 表示在时间 t t t 时某种动物或细菌种群的个体数量,那么似乎可以合理地假设增长速率 f ’ ( t ) f’(t) f’(t) 与种群 f ( t ) f(t) f(t) 成正比…

Redis的基本使用

简介 传统的数据库是 关系数据库,但是Redis是键值对数据库传统的数据库是基于 磁盘存储的,但是Redis是基于 内存存储的 基于内存,读写性能更高内存是不大的,只能存储热点信息 安装 绿色软件,安装即可使用 安装服务 手…

【MySQL】子查询、合并查询、表的连接

目录 一、子查询 1、单行子查询 显示SMITH同一部门的员工信息 2、多行子查询 in关键字 查询和10号部门的工作岗位相同的雇员的名字、岗位、工资、部门号,但是筛选出的雇员的部门不能有10号部门 all关键字 查询工资比30号部门中所有雇员工资高的雇员的姓名、…

LLM端侧部署系列 | PowerInfer-2助力AI手机端侧部署47B大模型 (论文解读)

引言 简介 PowerInfer-2 概述 神经元感知的运行时推理 多态神经元引擎 内存中的神经元缓存 灵活的神经元加载 Neuron-Cluster-Level Pipeline 生成执行计划 执行 总结 0. 引言 一雨池塘水面平,淡磨明镜照檐楹。东风忽起垂杨舞,更作荷心万点声…

十、敌人锁定

方法:通过寻找最近的敌人,使玩家的面朝向始终朝向敌人,进行攻击 1、代码 在这个方法中使用的是局部变量,作为临时声明和引用 public void SetActorAttackRotation() {Enemys GameObject.FindGameObjectsWithTag("Enemy&qu…

工程机械车辆挖掘机自卸卡车轮式装载机检测数据集VOC+YOLO格式2644张3类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2644 标注数量(xml文件个数):2644 标注数量(txt文件个数):2644 标注…

Vue+NestJS项目实操(图书管理后台)

一、项目搭建 前端基于vben进行二次开发 在Github下载vben框架,搜索vben即可 下载地址:https://github.com/vbenjs/vue-vben-admin 下载完成后,进行安装依赖,使用命令: // 下载依赖 pnpm install// 运行项目 pnpm …

每日一练:地下城游戏

174. 地下城游戏 - 力扣(LeetCode) 题目要求: 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔…

基于facefusion的换脸

FaceFusion是一个引人注目的开源项目,它专注于利用深度学习技术实现视频或图片中的面部替换。作为下一代换脸器和增强器,FaceFusion在人脸识别和合成技术方面取得了革命性的突破,为用户提供了前所未有的视觉体验。 安装 安装基础软件 安装…

数据链路层(以太网简介)

一.以太网数据帧结构: 目的地址,源地址,类型这三个被称为帧头,数据则被称为载荷,CRC则被称为帧尾(校验和) 二.数据帧结构分析 1.目的地址和源地址 i.地址解释 这两个地址指的是mac地址&#x…

国庆游玩计划安排

地点:上海前滩四方城 地点:船长酒吧 地点:上海🏛️外滩华尔道夫

httpsok-v1.17.0-SSL通配符证书自动续签

🔥httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具,基于全新的设计理念,专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业,稳定、安全、可靠。 一行命令,一分钟轻…

HTML基础用法介绍一

VS code 如何快速生成HTML骨架注释是什么?为什么要写注释?注释的标签是什么?标题标签段落标签换行标签与水平线标签 (都是单标签)文本格式化标签图片标签超链接标签音频标签视频标签 🚘正片开始 VS code 如何快速生成…

深度学习每周学习总结J1(ResNet-50算法实战与解析 - 鸟类识别)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数:定义损失函数,学习率&a…

STM32+PWM+DMA驱动WS2812 —— 2024年9月24日

一、项目简介 采用STM32f103C8t6单片机,使用HAL库编写。项目中针对初学者驱动WS2812时会遇到的一些问题,给出了解决方案。 二、ws2812驱动原理 WS2812采用单线归零码的通讯方式,即利用高低电平的持续时间来确定0和1。这种通信方式优点是只需…

Vue 学习

vue 核心语法 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue 核心语法测试</title> </head><body&…

外包功能测试干了4年,技术退步太明显了。。。。。​

先说一下自己的情况&#xff0c;本科生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测…

信号用wire类型还是reg类型定义

wire类型就是一根线&#xff0c;线有两端&#xff0c;一端发生改变&#xff0c;经过线传递的信号当然也会发生改变&#xff0c;reg类型则不同&#xff0c;可以把reg类型理解为存储数据的寄存器&#xff0c;当满足一定条件时&#xff0c;数值才被激活发生改变。 那么&#xff0…

【AI论文精读1】针对知识密集型NLP任务的检索增强生成(RAG原始论文)

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构&#xff08;用一个例子来阐明&#xff09;场景例子&#xff1a;核心点&#xff1a; 五、方法 &#xff08;架构各部分详解&#xff09;5.1 模型1. RAG-Sequence Model2. RAG-Toke…