Java中Object类

简介: Object类是Java所有类的超类,在Java中所有类都是由它扩展来的,可以用Object类型的变量来引用(接收)任意类型的对象.但要想对接收的对象进行具体操作,就需要进行类型转换,将Object类型转换为接收的对象的类型.

Object类是Java所有类的超类,在Java中所有类都是由它扩展来的,可以用Object类型的变量来引用(接收)任意类型的对象.但要
想对接收的对象进行具体操作,就需要进行类型转换,将Object类型转换为接收的对象的类型.在Java中只有基本数据类型不是对象,其他类型都扩展于Object.
这里介绍Object类的equals()方法和hashCode()方法

1.equals()方法

equals()是开发中常用的判断的方法之一,与equals()方法常放在一起比较的是==,现在比较的是Object类中的equals()和String类中的equals()方法.源码如下图所示
Object类中equals()方法
Object_Equals
String类中的equals()方法
String_Equals
Object类是所有类的超类,它的equals()方法和hashCode()方法是可以被重载的,通过源码可以看出,String类重写了equals()方法和hashCode()方法.
在String类中equals()方法用来判断两个对象的内容是否相等,在Object类中,equals()方法判断的是两个对象是否是相同的引用,如果引用是相等的,那么两个对象也一定相等,对于纯字符串比较来说,直接比较的是两个独立对象内容的值是否相等,也就是String字符串的比较.以下示例说明这一点.
string
_
equals
_
以上是按照个人想法做出的测试,如果有兴趣,可自行尝试多种方式测试.

Java语言规范要求equals方法具有以下特性:

1.自反性:对于任何非空引用x,x.equals(x)应该返回true
2.对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,那么x.equals(y)也应该返回为true
3.传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true
4.一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)方法应该返回同样的结果
5.非null:对于任何非空引用x,x.equals(null)应该返回false


2.hashCode()方法

hash code(散列码),是由对象导出的一个整型值.散列码没有规律,如果x和y是两个不同的对象,x.hashCode()和y.hashCode()
基本不会相同.在此比较的还是String类和Object类的区别.
# Object类的hashCode()方法
Object_HashCode
# String类的hashCode()方法
String_HashCode
Object类中的hashCode()方法是返回的对象在内存中的地址转成的int的值,每个对象都有一个默认的散列码,值为对象的存储
地址String类的hashCode()方法和object类的hashCode方法的区别就是,String类的hashCode()方法覆盖了Object类的
hashCode()方法,构成了重载,String的hashCode()方法是String字符串里面的每个字符的字符值得hashCode的和,只要字符串的内容一样,那么他们的hashCode就会一样,Object是用本地方法得到的内存地址的int值,以下示例可以说明这一点.
7840aba2103b2f40b1acd98ce450a8e9
_
程序运行结果,s和t的hash值相同,证明了String类的散列码是由内容导出的,而sh和th的hash值不同,是因为在StringBuffer中没有定义hashCode()方法,所以它的散列码也就是hash值是由Object类的默认的hashCode()方法导出的对象存储的地址.
JDK中对hashCode()方法的作用,以及实现时的注意事项做了一下说明:
(1)hashCode()在hash表中起作用,如:HashMa,HashSet
(2)如果对象在equals()方法中的内容没有改变,那么hashCode()值也始终不变
(3)如果两个对象使用equals()方法判断为相等,那么hashCode()方法也应该相等
(4)如果两个对象使用equals()方法判断为不相等,那么hashCode()方法也必须不相等
hashCode()方法在哈希表中起作用,当我们向哈希表中添加对象object时,会首先调用hashCode()方法计算object的哈希码,通过哈希码直接定位object在哈希表中的位置,如果该位置没有对象,可以直接将object插入,如果有对象(可能有多个,通过链表实现),调用equals()方法比较这些对象的是否跟object对象是否相等,如果相等,不保存object对象,如果不相等,将object对象加入到链表中.这也说明了为什么两个对象使用equals()方法判断为相等,那么hashCode()方法也应该相等,如果两个对象相等,那么在哈希表中只应该出现一次.
以上纯属个人观点,如有不足或错误,欢迎指正

目录
相关文章
|
12天前
|
安全 Java 开发者
【JAVA】哪些集合类是线程安全的
【JAVA】哪些集合类是线程安全的
|
1天前
|
C#
c# 所有类的最终基类:Object
c# 所有类的最终基类:Object
3 0
|
2天前
|
Java 开发者
在Java中,接口和超类在多态性中扮演着重要的角色
Java中的接口和超类支持多态性,接口作为规范,允许多继承和回调机制;超类提供基类,实现代码重用和方法重写,两者共同促进代码的灵活性和可维护性。
24 10
|
2天前
|
Java
Java并发Futures和Callables类
Java程序`TestThread`演示了如何在多线程环境中使用`Futures`和`Callables`。它创建了一个单线程`ExecutorService`,然后提交两个`FactorialService`任务,分别计算10和20的阶乘。每个任务返回一个`Future`对象,通过`get`方法获取结果,该方法会阻塞直到计算完成。计算过程中模拟延迟以展示异步执行。最终,打印出10!和20!的结果。
|
7天前
|
网络协议 Java
Java中如何使用Socket类检测端口是否存在
Java中如何使用Socket类检测端口是否存在
24 4
|
7天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
25 3
|
7天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
16 1
|
9天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
9天前
|
消息中间件 安全 Java
在Spring Bean中,如何通过Java配置类定义Bean?
【4月更文挑战第30天】在Spring Bean中,如何通过Java配置类定义Bean?
18 1
|
10天前
|
Java
Java对象和类研究
Java对象和类研究
8 0