一篇学习Java Object的常见方法

一、getClass

  • public final native Class<?> getClass()
    • 意义返回Object运行
    • 作用常用反射类型检查
    • 使用场景需要知道一个对象实际类型可以使用
public class GetClassExample {public static void main(String[] args) {GetClassExample example = new GetClassExample(); // 创建对象// 打印对象的运行时类System.out.println("对象的类是: " + example.getClass().getName());}
}

二、hashCode

  • public native int hashCode()
    • 意义返回对象哈希码
    • 作用哈希确定对象存储位置
    • 使用场景需要自定义对象作为哈希表需要重写hashcode方法
public class HashCodeExample {private int id; // 对象的标识符public HashCodeExample(int id) {this.id = id; // 初始化标识符}@Overridepublic int hashCode() {return id; // 返回对象的哈希码值}public static void main(String[] args) {HashCodeExample example = new HashCodeExample(123); // 创建对象并设置ID// 打印对象的哈希码值System.out.println("对象的哈希码是: " + example.hashCode());}
}

三、equals

  • public boolean equals(Object obj)
    • 意义某个对象是否对象相等
    • 作用比较两个对象是否相等
    • 使用场景当需要自定义对象相等逻辑需要重写equals方法(重写equals方法,同时也要重写hashcode,要保证它们一致性)
public class EqualsExample {private int id; // 对象的标识符public EqualsExample(int id) {this.id = id; // 初始化标识符}@Overridepublic boolean equals(Object obj) {if (this == obj) return true; // 如果两个对象引用相同,返回trueif (obj == null || getClass() != obj.getClass()) return false; // 如果对象为null或类不同,返回falseEqualsExample that = (EqualsExample) obj; // 类型转换return id == that.id; // 比较标识符}public static void main(String[] args) {EqualsExample example1 = new EqualsExample(123); // 创建第一个对象EqualsExample example2 = new EqualsExample(123); // 创建第二个对象// 打印两个对象是否相等System.out.println("对象是否相等: " + example1.equals(example2));}
}

四、clone

  • public native Object clone()
    • 意义创建返回对象一个副本
    • 作用实现对象浅拷贝
    • 使用场景:需要复制一个对象但是不希望两个对象引用同一个内存地址使用并且 clone方法受保护 需要实现一个Cloneable接口再去重写clone方法 调用super.clone()
public class CloneExample implements Cloneable {private int id; // 对象的标识符public CloneExample(int id) {this.id = id; // 初始化标识符}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 调用父类的clone方法}public static void main(String[] args) {try {CloneExample example1 = new CloneExample(123); // 创建对象CloneExample example2 = (CloneExample) example1.clone(); // 克隆对象// 打印克隆对象的IDSystem.out.println("克隆对象的ID是: " + example2.id);} catch (CloneNotSupportedException e) {e.printStackTrace(); // 捕获并打印异常}}
}

五、toString

  • public String toString()
    • 意义返回对象字符串表示
    • 作用方便打印对象信息转换字符串
    • 使用场景需要打印对象信息对象转换字符串通常需要重写toString方法
public class ToStringExample {private int id; // 对象的标识符public ToStringExample(int id) {this.id = id; // 初始化标识符}@Overridepublic String toString() {return "ToStringExample{id=" + id + '}'; // 返回对象的字符串表示}public static void main(String[] args) {ToStringExample example = new ToStringExample(123); // 创建对象// 打印对象的字符串表示System.out.println("对象的字符串表示: " + example.toString());}
}

六、notify

  • public final native void notify()
    • 意义唤醒对象监视器等待单个线程
    • 作用用于线程同步实现线程通信
    • 使用场景线程调用一个对象 wait方法另一个线程可以通过使用notify()notifyAll方法唤醒等待线程
class NotifyExample {private final Object lock = new Object(); // 锁对象public void waitingThread() {synchronized (lock) {try {System.out.println(Thread.currentThread().getName() + " 正在等待...");lock.wait(); // 进入等待状态System.out.println(Thread.currentThread().getName() + " 已经恢复!");} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 处理中断异常}}}public void notifyingThread() {synchronized (lock) {lock.notify(); // 唤醒一个等待线程System.out.println(Thread.currentThread().getName() + " 已通知一个线程.");}}public static void main(String[] args) throws InterruptedException {NotifyExample example = new NotifyExample(); // 创建示例对象Thread t1 = new Thread(example::waitingThread, "线程-1");Thread t2 = new Thread(example::waitingThread, "线程-2");t1.start(); // 启动第一个线程t2.start(); // 启动第二个线程Thread.sleep(1000); // 确保两个线程进入等待状态new Thread(example::notifyingThread, "通知线程").start(); // 启动通知线程}
}

七、notifyAll

  • public final native void notifyAll()
    • 意义唤醒对象监视器等待所有线程
    • 作用用于多线程同步实现线程通信唤醒所有等待线程
    • 使用场景唤醒所有线程
class NotifyAllExample {private final Object lock = new Object(); // 锁对象public void waitingThread() {synchronized (lock) {try {System.out.println(Thread.currentThread().getName() + " 正在等待...");lock.wait(); // 进入等待状态System.out.println(Thread.currentThread().getName() + " 已经恢复!");} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 处理中断异常}}}public void notifyingThread() {synchronized (lock) {lock.notifyAll(); // 唤醒所有等待线程System.out.println(Thread.currentThread().getName() + " 已通知所有线程.");}}public static void main(String[] args) throws InterruptedException {NotifyAllExample example = new NotifyAllExample(); // 创建示例对象Thread t1 = new Thread(example::waitingThread, "线程-1");Thread t2 = new Thread(example::waitingThread, "线程-2");t1.start(); // 启动第一个线程t2.start(); // 启动第二个线程Thread.sleep(1000); // 确保两个线程进入等待状态new Thread(example::notifyingThread, "通知线程").start(); // 启动通知线程}
}

八、wait

  • public final native void wait(long timeout);
    • 意义使当前线程等待直到其他线程调用对象notifynotifyAll方法
    • 作用用于多线程同步使线程进入等待状态
    • 使用场景需要多线程环境实现等待/通知机制使用wait 方法
class WaitTimeoutExample {private final Object lock = new Object(); // 锁对象public void waitingThread() {synchronized (lock) {try {System.out.println(Thread.currentThread().getName() + " 正在等待 2 秒...");lock.wait(2000); // 等待2秒System.out.println(Thread.currentThread().getName() + " 已经恢复!");} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 处理中断异常}}}public static void main(String[] args) throws InterruptedException {WaitTimeoutExample example = new WaitTimeoutExample(); // 创建示例对象Thread t1 = new Thread(example::waitingThread, "线程-1");t1.start(); // 启动线程t1.join(); // 等待线程结束}
}

九、wait

​​​​​​
  • public final native void wait(long timeout, int nanos)
    • 意义提供了更为精准等待时间
    • 作用用于多线程同步使线程进入等待状态
    • 使用场景
      • 高精度定时等待线程非常精确时间唤醒
      • 等待特定事件发生在特定事件发生并且等待时间需要精确控制
      • 同步协调同步协调多个线程执行使得线程能够特定时间得到控制
class WaitNanosExample {private final Object lock = new Object(); // 锁对象public void waitingThread() {synchronized (lock) {try {System.out.println(Thread.currentThread().getName() + " 正在等待 2 秒和 500 纳秒...");lock.wait(2000, 500); // 等待2秒和500纳秒System.out.println(Thread.currentThread().getName() + " 已经恢复!");} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 处理中断异常}}}public static void main(String[] args) throws InterruptedException {WaitNanosExample example = new WaitNanosExample(); // 创建示例对象Thread t1 = new Thread(example::waitingThread, "线程-1");t1.start(); // 启动线程t1.join(); // 等待线程结束}
}

十、finalize

    • 意义当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
    • 作用允许对象在垃圾回收之前执行清理操作。
    • 使用场景
      • 资源释放在对象销毁之前释放资源比如关闭文件数据库链接网络连接
      • 临时文件删除删除对象创建临时文件确保对象销毁时不留下临时文件
      • 内存资源清理处理内存资源清理工作释放一些操作系统资源
public class FinalizeExample {@Overrideprotected void finalize() throws Throwable {// 在垃圾回收之前执行清理操作System.out.println("对象正在被垃圾回收");}public static void main(String[] args) {FinalizeExample example = new FinalizeExample(); // 创建对象example = null; // 将对象置为null,使其可被垃圾回收System.gc(); // 请求垃圾回收// 给垃圾回收一些时间运行try {Thread.sleep(2000);} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 处理中断异常}}
}

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

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

相关文章

自学动态规划——完全平方数

完全平方数 279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09; 和上一道题&#xff08;零钱兑换&#xff09;一样&#xff0c;就不再赘述&#xff0c;详情可以点击链接看看上一篇博文。 AC&#xff1a; int numSquares(int n) {const int MAX0x3f3f3f3f;vector<in…

【论文解读】OpenMix+: Revisiting Data Augmentation for Open Set Recognition

1、摘要 开集识别要求模型识别训练集中学习到的已知类样本&#xff0c;同时拒绝未学习到的未知类。与封闭集问题的结构风险最小化理论相比&#xff0c;开放集任务中的结构风险研究较少。本文指出结构风险与开放空间风险的平衡是开集识别的关键&#xff0c;并将其转化为开集结构…

12.可视化实现

时间过的很快,不知不觉已到第十二章。经过前面教程的讲解和实践,数据接入服务的功能已初步完成。 此章节将通过可视化的实现,对设备接入进行监控,实时监听设备的接入情况及设备的在线时长。 并且可以通过订阅按钮、取消订阅按钮、查看数据按钮,对上报数据进行实时的跟踪…

旧手机翻身成为办公利器——PalmDock的介绍也使用

旧手机有吧&#xff01;&#xff01;&#xff01; 破电脑有吧&#xff01;&#xff01;&#xff01; 那恭喜你&#xff0c;这篇文章可能对你有点用了。 介绍 这是一个旧手机废物利用变成工作利器的软件。可以在 Android 手机上快捷打开 windows 上的文件夹、文件、程序、命…

4月平板电脑行业线上销售数据分析

由于全球科技发展趋势&#xff0c;如AI技术的应用&#xff0c;以及厂商新品发布计划&#xff1b;同时&#xff0c;平板电脑作为个人电脑的延伸产品&#xff0c;其便携性和生产力相较于手机具有明显优势&#xff0c;这也为行业的进一步发展提供了动力。 据鲸参谋数据统计&#…

美团拼好饭小程序mtgsig1.2分析(补环境分析)

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

SQL:用AI软件来完成sql的触发器的使用

说明&#xff1a;本章主要使用baidu comate 的AI软件来完成 1.创建表 问题1&#xff1a;帮我创建2个表student与score表&#xff0c;要求student表有id,createDate,userName,phone,age,sex,introduce&#xff0c; 要求score表有id,scoreName,result,studentId(student表的id…

【高频】redis快的原因

相关问题&#xff1a; 1.为什么Redis能够如此快速地进行数据存储和检索&#xff1f; 2.Redis作为内存数据库,其内存存储有什么优势吗? 3.Redis的网络模型有何特点,如何帮助提升性能? 一、问题回答 Redis使用了内存数据结构&#xff0c;例如字符串、哈希表、列表、集合、有…

python+pytest+pytest-html+allure集成测试案例

pythonpytestpytest-htmlallure集成测试案例 下面是pythonpytestpytest-htmlallure四个组件同时集成使用的简单案例。 1. 项目结构 project/ │ ├── src/ │ ├── __init__.py │ ├── main.py │ ├── tests/ │ ├── __init__.py │ ├── conftest.p…

【Linux】centos7编写C语言程序,补充:使用yum安装软件包组

确保已安装gcc编译器 C语言程序&#xff0c;一般使用gcc进行编译&#xff0c;需确保已安装gcc。 若没有&#xff0c;可以使用yum安装gcc&#xff08;版本4.8.5&#xff09;&#xff0c;也可以使用SCL源安装gcc&#xff08;例如&#xff1a;版本9.3&#xff09;。 安装gcc&am…

2024.05.29学习记录

1、css面经复习 2、代码随想录二刷 3、rosebush upload组件初步完成

Linux网络编程: udp,tcp协议原理

Linux网络编程: udp,tcp协议原理 一.udp和tcp的介绍1.udp介绍1.udp的特点2.udp的适用场景3.udp效率分析 2.tcp介绍1.tcp的特点2.tcp的适用场景 二.udp协议原理1.udp协议段格式2.udp的缓冲区和全双工通信 三.tcp协议段1.tcp协议段格式2.发送接收缓冲区3.确认应答ACK机制,窗口大小…

Rosetta PyRosetta 源码包 安装包 下载

--- pyrosetta_src.zip包含以下包&#xff1a; | --- PyRosetta4.Debug.python27.ubuntu.release-185.tar.bz2 | --- PyRosetta4.Release.python27.linux.release-215.tar.bz2 | --- PyRosetta4.Release.python38.ubuntu.release-349.tar.bz2 --- pyrosetta_whl.zip包含…

C语言---文件操作

【C语言详解】——文件操作&#xff08;建议收藏&#xff09;_c语言 写文件原理-CSDN博客 一、文件的读取 # define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<errno.h> #include<string.h>int main() {FILE * pffopen("C:\\Users\\zhw\\De…

Java设计模式 _行为型模式_观察者模式

一、观察者模式 1、观察者模式 观察者模式 ( Observer Pattern )是一种行为型模式。 常用于对象间存在一对多关系时&#xff0c;比如&#xff0c;当一个对象被修改时&#xff0c;需要自动通知它的依赖对象。 2、实现思路 &#xff08;1&#xff09;、定义被观察者的行为&…

Python Selenium 详解:实现高效的UI自动化测试

落日余辉&#xff0c;深情不及久伴。大家好&#xff0c;在当今软件开发的世界中&#xff0c;自动化测试已经成为保障软件质量和快速迭代的重要环节。而在自动化测试的领域中&#xff0c;UI自动化测试是不可或缺的一部分&#xff0c;它可以帮助测试团队快速验证用户界面的正确性…

Django学习

1.pycharm社区版创建django PyCharm社区版如何创建Django项目并运行_pycharm社区版打开django-CSDN博客 2.Django TemplateDoesNotExist: rest_framework 当我们使用djangorestframework框架时&#xff0c;首先下载pip install djangorestframework 参考博文Django Templat…

Windows环境编译zlib库

zlib 是一个用来进行数据压缩的开源软件库,由 Jean-loup Gailly 和 Mark Adler 编写。它提供了对 DEFLATE 压缩算法的支持,这种算法广泛用于 gzip 和 PNG 文件格式。 官网地址:链接 本文将使用VS2022+Cmake编译zlib库,操作系统为Windows10,编译好的动态库及静态库见文末链…

MATLAB分类与判别模型算法: 快速近邻法(FastNN)分类程序【含Matlab源码 MX_005期】

算法思路介绍&#xff1a; 1. 数据准备阶段&#xff1a; 生成一个合成数据集 X&#xff0c;其中包含三个簇&#xff0c;每个簇分布在不同的区域。 定义聚类层数 L 和每个层次的子集数量 l。 2. 聚类阶段&#xff1a; 使用K均值聚类算法将初始数据集 X 分成 l 个簇。…

transformers.BertTokenizer入门使用

教程link 示例代码 from transformers import OpenAIGPTLMHeadModel, GPT2LMHeadModel, BertTokenizer import torch tokenizer BertTokenizer.from_pretrained("thu-coai/CDial-GPT_LCCC-large") model OpenAIGPTLMHeadModel.from_pretrained("thu-coai/CD…