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

JAVA常见的工具类之Object类(超详细)

1、Java API简介

        Java API(Java Application Programming Interface)是Java应用程序编程接口的缩写。Java中的API,就是JDK提供的具有各种功能的Java类,灵活使用Java API能够大大提高使用Java语言编写程序的效率。

        Java API的帮助文档可到 http://docs.oracle.com/javase/8/docs/api/ 下载,灵活使用Java API能够提高使用Java语言编写程序的效率,下面对Java中提供的最常用的包进行介绍,对这些包中的常用类先有一个总体了解,后文将对重要的、常见的方法进行介绍。

  • java.lang:Java语言包, 该包中提供了利用Java语言进行程序设计的基础类,比如String、Math、System类,该包中的类不需要使用import语句进行导入,都会被自动导入。
  • java.util:该包中主要包含一些实用的工具类,比如集合框架类、日期处理类、字符串解析类、随机数生成类等。
  • java.awt:该包中主要包含处理用户界面和绘制图形图像的各种类。
  • java.io:该包中主要包含处理输入、输出编程的各种类。
  • java.net:该包中主要包含处理网络编程的各种类。
  • java.sql:该包中主要包含处理数据库编程的各种类。

1. Java.lang包中常用的类

java.lang包中的常用类

Boolean

Object

Error

Byte

String

Throwable

Character

StringBuffer

Exception

Double

StringBuilder

ClassNotFoundException

Float

System

NullPointerException

Integer

Math

NumberFormatException

Long

Runnable(接口)

RuntimeException

Short

Thread

ArithmeticException

2. java.util包中常用的类

java.util包中的常用类

Collection(接口)

Arrays

Calendar

Iterator(接口)

Set(接口)

Date

ListIterator(接口)

HashSet

Random

List(接口)

TreeSet

Scanner

ArrayList

Map(接口)

Collections

LinkedList

HashMap

Vector

Hashtable

Stack

TreeMap

3. java.io包中的常用的类

java.io包中的常用类

BufferedInputStream

FileReader

PrintWriter

BufferedOutputStream

FileWriter

Reader

BufferedReader

InputStream

Writer

BufferedWriter

InputStreamReader

Serializable(接口)

DataInputStream

OutputStream

Externalizable接口)

DataOutputStream

OutputStreamWriter

IOException

File

ObjectInputStream

FileNotFoundException

FileInputStream

ObjectOutputStream

InvalidClassException

FileOutputStream

PrintStream

4. java.net包中常用的类

java.net包中的常用类

ServerSocket

Socket

UnknownHostException

2、Object类

        在Java中,有这样一个类,它是所有类的祖先类,也就是说,任何类都是其子孙类,它就是java.lang.Object。如果一个类没有显式地指明其父类,那么它的父类就是Object,也就是说,下面两条语句的作用是一样的:

public class ClassName{…}

等价于

public class ClassName extends Object{…}

        如同我们称自己为炎黄子孙一样,所有的类都是Object类的子类,Object类中定义的方法被遗传到所有其它类中。同时,Object类也是Java语言中唯一一个没有父类的类。

        做为一个超级祖先类,Object类为子类提供了一些public修饰的方法,便于子类覆盖来实现子类自己特定的功能,下面我们要详细介绍其中的equals()方法、hashCode()方法和toString()方法。

1. public boolean equals(Object obj)

        该方法在Object类中的作用是:比较两个引用所指向的对象是否是同一个对象,即两个引用所指向对象的地址是否相等。

        注意,通常情况下,所有的类中equals()方法默认是比较地址,但是,Object的任何子类均可以按照自己的需要对equals()方法进行覆盖,以改变此方法的操作细节,实现使用自定义的方法判断两个对象是否为同一个对象或者两个对象是否具有可互相替代性。

        【例】 定义公民类Citizen,覆盖该类的equals()方法,该方法的定义为:如果两个公民的身份id相同,则为同一个公民,但是不用考虑这两个对象是否具有相同的地址。

public class Citizen{private int id;private String name;public Citizen(int id, String name) {this.id = id;this.name = name;}//覆盖父类的equals()方法public boolean equals(Object o) {Citizen c = (Citizen) o;if (c.id == this.id) {return true;} else {return false;}}//主方法,测试equals()方法public static void main(String args[]) {Citizen xiaoming = new Citizen(21000, "xiaoming");Citizen mingming = new Citizen(21000, "mingming");System.out.println(xiaoming.equals(mingming));}
}
//程序运行结果:true

        程序分析:上例定义了一个Citizen类,此类包含了公民的两个属性id和name,同时覆盖了equals()方法,该方法实现为:当传入对象的id和当前对象的id相等时,返回true,否则返回false。所以在main()方法最后一行调用equals()方法时,调用的实际上是Citizen类的equals()方法,xiaoming和mingming对象的id都为21000,所以程序运行结果为true。而假设如果Citizen类没有覆盖equals()方法,则在最后一行调用equals()方法时,实际调用的Object类的equals()方法,该方法比较两个对象是否指向同一块地址,所以肯定返回false,读者可自行验证。

        "=="运算符和equals()方法的区别:"=="是比较运算符,既能用于比较两个基本数据类型,也能用于比较两个引用数据类型,当比较基本数据类型时,判断两个基本数据类型的字面量是否相等,当比较两个引用数据类型时,判断两个"地址"的值是否相等,也就是两个"引用"是否指向同一个对象。而equals()方法只能用于比较引用数据类型(也就是所有以Object类为父类的类型),Object类的equals()方法默认比较两个对象引用的值是否相等,但equals()方法通常都会被子类覆盖,所以子类中equals()方法的含义,就要看子类中的具体实现了。

        【例】 == 和 equals()方法在String类中的区别

	String str1 = "hello"; String str2 = new String("hello"); System.out.println(str1==str2); System.out.println(str1.equals(str2));

程序运行结果:

false

true

        程序分析:因为String是引用数据类型,使用"=="运算符比较两个引用地址是否相同,第二行使用关键字new重新生成了一个String对象,所以第三行输出为false。在String类中,覆盖了Object的equals()方法,该方法判断两个String对象的内容是否相等,所以第4行输出为true。

2. public int hashCode()

        该方法返回对象的哈希码。任何一个对象的默认的哈希码是将对象的内存地址通过某种转换得到的,所以不同对象会有不同的哈希码。

        哈希码是一个代表对象的十六进制整数,好比对象的身份证号。在程序运行期间,每次调用同一个对象的hashCode()方法,返回的哈希码必定相同。但是Java应用程序需要的内存由操作系统提供,所以多次执行同一个程序,因操作系统的运行情况不一样,内存使用情况也不一样,程序所获得的内存不同,这就导致同一个对象的哈希码也不一定相同。

        在Java中有个规定:如果equals()方法返回两个对象是相等的,那这两个对象上调用hashCode()返回的整数必须相等,否则在使用Hash类型集合时就会产生错误,所以在我们覆盖equals()方法同时,建议覆盖hashCode()方法。需要说明,如果equals()返回两个对象不等,它们的hashCode()也可以返回相同的整数,但是最好让它们的hashCode()返回不同的整数,这有利于提高Hash类型集合的性能。那么重写equals()方法时,一定要重写hashcode()方法吗?先说说hashcode()方法调用的条件,如果你想往map里面放一个类作为map的键值,这个类又是你自己设计的,或者这个类不是你写的但是你修改了这个类的equals()方法,这个时候,你就要重写hashcode()方法,这样当你往map里放值的时候,系统会调用这个对象的hashcode()方法来生成相应的hash值,来映射相应的对象。

        如果同一个类的两个对象的属性值相等,那么他们的hashcode()一定相等吗?这个要看你具体如何实现你的hashcode()方法,如果你希望他们的值一样hashcode()也一样,你就可以这样实现。但是hashcode的实现,一般要满足几个特征:

自反性:即对任意一个非空的指引值x,x.equals(x)永远返回true。

对称性:即对任意两个非空的指引值x,y,如果x.equals(y)返回true,那么y.equals(x)也返回true。

传递性:当x.equals(y)返回true并且y.equals(z)返回true时,x.equals(z)也返回true。

3. public String toString()

        该方法返回对象的字符串表示,形如:java.lang.Object@1db9742,也就是 类名@hashcode。toString()方法是一个从字面上就容易理解的方法,它的功能是得到一个能够代表该对象的一个字符串:类名+"@"+代表该对象的一个唯一的16进制数,例如下面这个例子:

        【例】 查看Object类和String类的toString()方法返回值。

public class ObjectSample {public static void main(String args[]){Object o = new Object();System.out.println(o);System.out.println(o.toString());String s = new String("hello");System.out.println(s);        }    
}

程序运行结果:

java.lang.Object@1db9742

java.lang.Object@1db9742

hello

        程序分析:前两个输出结果表示对象o在内存中的地址,事实上返回这样的字符串没有什么实际的意义。一般子类都会覆盖该方法,让它返回有意义的文本。例如上例中的对象s的输出为"hello",这是因为字符串String类对toString()进行了覆盖,让它返回此String的本身内容。

        下面通过实例来看一下如何在自己编写的类中覆盖equals()方法和toString()方法。

        【例】 equals()方法和toString()的覆盖

    //圆类public class MyCircle {private int radius;//半径public MyCircle(int r) {radius = r;}public int getRadius() {return radius;}public void setRadius(int r) {radius = r;}//覆盖Object中的equals()方法public boolean equals(Object obj) {MyCircle o = (MyCircle) obj;if (o.getRadius() == this.radius)return true;elsereturn false;}//覆盖Object中toString方法public String toString() {return "radius = " + radius;}}
//测试类
public class Test {public static void main(String[] args) {MyCircle obj1 = new MyCircle(3);System.out.println("obj1:" + obj1.toString());MyCircle obj2 = new MyCircle(3);System.out.println("obj2:" + obj2.toString());if (obj1.equals(obj2))System.out.println("the two objects are equal");elseSystem.out.println("the two objects are not equal");}
}

程序运行结果:

obj1:radius = 3

obj2:radius = 3

the two objects are equal

        程序分析:从程序的运行结果来看,我们创建的两个MyCircle对象是相等的,因为MyCircle类中覆盖的equals()方法规定,当两个MyCircle对象的半径相等时,认为这两个对象相等。而我们在调用MyCircle类的构造方法创建对象时设定这两个MyCircle对象的半径均为3,所以obj1.equals(obj2)返回true。

 

相关文章:

JAVA常见的工具类之Object类(超详细)

1、Java API简介 Java API(Java Application Programming Interface)是Java应用程序编程接口的缩写。Java中的API,就是JDK提供的具有各种功能的Java类,灵活使用Java API能够大大提高使用Java语言编写程序的效率。 Java API的帮助文档可到 http://docs.or…...

深度学习(YOLO、DETR) 十折交叉验证

二:交叉验证 在 K 折验证之前最常用的验证方法就是交叉验证,即把数据划分为训练集、验证集和测试集。一般的划分比例为 7:1:2。但如何合理的抽取样本就成为了使用交叉验证的难点,不同的抽取方法会导致截然不同的训练性…...

基于php网上差旅费报销系统设计与实现

网上报销系统以LAMP(LinuxApacheMySQLPHP)作为平台,涉及到PHP语言、MySQL数据库、JavaScript语言、HTML语言。 2.1 PHP语言简介 PHP,一个嵌套的缩写名称,是英文 “超级文本预处理语言”(PHP: Hypertext Preprocessor)的缩写。P…...

微服务及安全

一、微服务的原理 1.什么是微服务架构 微服务架构区别于传统的单体软件架构,是一种为了适应当前互联网后台服务的「三高需求:高并发、高性能、高可用」而产生的的软件架构。 单体式应用程序 与微服务相对的另一个概念是传统的单体式应用程序( Monolithic application ),…...

图文详解ThreadLocal:原理、结构与内存泄漏解析

目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中,ThreadLocal 类提供了一种方式,使得每个线程可以独立地持有自己的变量副本,而…...

基于java的综合小区管理系统论文.doc

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大,容错率低&am…...

如何合理设置PostgreSQL的`max_connections`参数

合理设置PostgreSQL的max_connections参数对于数据库的稳定性和性能至关重要。这个设置值决定了允许同时连接到数据库的最大客户端数量。如果设置不当,可能导致资源浪费或系统过载。以下是设置max_connections时需要考虑的几个关键因素: 1. 评估系统硬件…...

Kubectl 常用命令汇总大全

kubectl 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes 集群。 从用户角度来说,kubectl 就是控制 Kubernetes 的驾驶舱,它允许你执行所有可能的 Kubernetes 操作;从技术角度来看,kubectl 就是 Kubernetes…...

【Linux】Linux环境基础开发工具使用之Linux调试器-gdb使用

目录 一、程序发布模式1.1 debug模式1.2 release模式 二、默认发布模式三、gdb的使用结尾 一、程序发布模式 程序的发布方式有两种,debug模式和release模式 1.1 debug模式 目的:主要用于开发和测试阶段,目的是让开发者能够更容易地调试和跟…...

clickhouse_driver

一、简介 clickhouse_driver是一个Python库,用于与ClickHouse数据库进行交互。ClickHouse是一个高性能的列式数据库管理系统(DBMS),它适用于实时分析(OLAP)场景。clickhouse_driver模块提供了与ClickHouse…...

BI分析实操案例分享:零售企业如何利用BI工具对销售数据进行分析?

在当下这个竞争激烈的零售市场,企业如何在波诡云谲的商场中站稳脚跟,实现销售目标的翻倍增长? 答案可能就藏在那些看似杂乱无章的数字里。 是的,你没有看错,答案正是那些我们日常接触的销售数据。它们就像是宝藏&…...

python : Requests请求库入门使用指南 + 简单爬取豆瓣影评

Requests 是一个用于发送 HTTP 请求的简单易用的 Python 库。它能够处理多种 HTTP 请求方法,如 GET、POST、PUT、DELETE 等,并简化了 HTTP 请求流程。对于想要进行网络爬虫或 API 调用的开发者来说,Requests 是一个非常有用的工具。在今天的博…...

宋红康JVM调优思维导图

文章目录 1. 概述2. JVM监控及诊断命令-命令行篇3. JVM监控及诊断工具-GUI篇4. JVM运行时参数5. 分析GC日志 课程地址 1. 概述 2. JVM监控及诊断命令-命令行篇 3. JVM监控及诊断工具-GUI篇 4. JVM运行时参数 5. 分析GC日志...

linux 网卡配置

linux网卡可以通过命令和配置文件配置,如果是桌面环境还可以通过图形化界面配置. 1.ifconfig(interfaces config)命令方式 通常需要以root身份登录或使用sudo以便在Linux机器上使用ifconfig工具。依赖于ifconfig命令中使用一些选项属性,ifconfig工具不仅可以被用来…...

IEEE |第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)

第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)定于2024年10月18-20日在中国杭州隆重举行。本届会议将主要关注机器学习和计算机应用面临的新的挑战问题和研究方向,着力反映国际机器学习和计算机应用相关技术研究的最新进展。 IEEE |第五届机器学习与计算机应…...

【网络安全】漏洞挖掘:IDOR实例

未经许可,不得转载。 文章目录 正文 正文 某提交系统,可以选择打印或下载passport。 点击Documents > Download后,应用程序将执行 HTTP GET 请求: /production/api/v1/attachment?id4550381&enamemId123888id为文件id&am…...

vue项目执行 cnpm install 报错证书过期的解决方案

拉下源码后执行依赖安装过程,报错 error Error: Certificate has expired,可以通过一下方发解决:npm config set strict-ssl false 再执行 cnpm 命令即可正常拉依赖...

XGboost的安装与使用

安装xgboost: conda install py-xgboost下载demo的数据: https://github.com/dmlc/xgboost 安装graphviz conda install python-graphviz数据 在demo/data里面: 训练集是:agaricus.txt.train、测试集是:agaricus…...

【AI趋势9】开源普惠

关于开源的问题,可以参考我之前的文章: 再说开源软件-CSDN博客 【AI】马斯克说大模型要开源,我们缺的是源代码?(附一图看懂6大开源协议)_分开源和闭源,我们要的当然是开源,马斯克开源。-CSDN博客 一、开…...

【Spark集群部署系列一】Spark local模式介绍和搭建以及使用(内含Linux安装Anaconda)

简介 注意: 在部署spark集群前,请部署好Hadoop集群,jdk8【当然Hadoop集群需要运行在jdk上】,需要注意hadoop,spark的版本,考虑兼容问题。比如hadoop3.0以上的才兼容spark3.0以上的。 下面是Hadoop集群部署…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...