Java中Object类

  1. 云栖社区>
  2. 博客>
  3. 正文

Java中Object类

吴流离 2019-07-12 16:17:00 浏览267
展开阅读全文

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()方法也应该相等,如果两个对象相等,那么在哈希表中只应该出现一次.
以上纯属个人观点,如有不足或错误,欢迎指正

网友评论

登录后评论
0/500
评论
吴流离
+ 关注