Object类延伸一

主要是对Object中方法涉及到知识点,总结归类。

Object类中的equals()方法

1.equals()方法

判断两个对象是否相等,子类中一般要重写该方法。

public boolean equals(Object obj) {
        return (this == obj);
    }

equals()与==的区别:

(1)==

a.基本类型比较,比较的是值

b.引用类型比较,比较的是内存地址

== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
(2)equals()方法

引用类型如果没有重写equal()方法,那么对象调用equals()进行比较,如a.equals(b),实际上是会调用a父类的equals()方法(如果有父类的话),直到调用Object的equals()方法。Object比较的还是两个对象的内存地址,相同返回true,不同返回false。

但是对于基本类型的引用类型,如Integer,String对于equals()都有自己的实现,比较的不是内存地址。

这里有个特殊的String,它是java中唯一不需要new 就可以产生对象的途径。

String s="abce";形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd",下一次如果有String s1 = "abcd";又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.

综上,==与equals()相比,==的速度快一些,因为它只比较内存地址。

2.hashCode()

返回对象的哈希码值。

 public native int hashCode();

约定:

(1)重写equals()方法,必须重写hashCode()方法。

(2)如果两个对象equals()比较相等,则其hashCode()也必须相等。常用与Set集合中添加不同对象

(3)hashCode()相等,equals()不一定相等。

hashCode()方法主要是用于增强哈希表的性能。以Set为例。

Set集合判断两个对象相同不是使用”==“运算符,而是根据equals方法。也就是说,我们在加入一个新元素时,如果这个新元素对象和Set中所有对象进行equals比较都返回false,则Set就会接受这个新元素对象,否则拒绝。

HastSet是Set接口的典型实现,HashSet使用HASH算法来存储集合中的元素,具有良好的存取和查找性能。

当向HashSet集合中存入一个元素时,

a. HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,

b. 根据该HashCode值决定该对象在HashSet的存储位置。

HashSet类:

  private transient HashMap<E,Object> map;  
public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

 调用HashMap的put方法,put方法会调用hash算法,计算哈希值

   public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

如果不遵循(2)会有什么问题呢?

假如有两个对象a,b

a.equals(b) 返回true,但是a和b的哈希值不同,也就是hashCode()返回值不同,

那么,根据上面,HashSet会根据hashCode值,把a,b放在HasH表不同的位置,从而添加对象成功。这就与Set集合不能添加重复元素不一致了。

我们要明确的是:equals()决定是否可以加入HashSet,而hashCode()决定存放的位置,他们两者必须同时满足才能允许一个新元素加入HashSet。

值得注意的是:如果两个对象的hashCode相同,但是他们的equals返回值不同,HashSet会在这个位置用链式结构来保存多个对象。而HashSet访问集合元素时也是根据元素的HashCode的值来快速定位的,这种链式结构会导致性能下降。

所以,如果要把某个类的对象保存到HashSet集合中,我们在重写这个类的equasl()方法和hashCode()方法时,应该尽量保证两个对象通过equals()方法比较,返回true时,他们hashCode()方法返回值也相等

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值