equals与==

equals和==的异同:

  1. equals和“==”都是用于对象的比较,检查两个对象的相等性;
  2. “==”是操作符,因为在Java中操作符不能被重载,所以“==”的行为对每个对象来说都是相同的,而equals是方法,可以根据业务规则的不同进行重写;
  3. “==”是基于对象的内存引用来进行比较的,如果两个对象的引用完全相同,即指向同一个对象,则为true;

注意:

  1. 对于既不是float也不是double类型的基本类型域,可以使用“==”操作符进行比较;对于对象引用域,可以递归调用equals方法;对于float或double域,可以使用Float/Double的compare方法(因为存在Float.NaN和-0.0f以及类似的double常量,所以特殊处理);对于数组则要把做上述原则应用到每个元素上。
  2. 无论什么时候重写了equals方法,必须重写hashCode方法;如果在覆盖equals后没有覆盖hashCode,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合(Hashtable,HashMap,HashSet)一起工作。
  3. 如果一个类是不可变的,并且计算散列码的开销较大,就可以考虑把散列码缓存在对象内部,而不是每次请求的时候都重新计算散列码;如果你觉得这种类型的大多数对象会被用作散列键,就应该在创建实例的时候计算散列码,否则,可以选择“延迟初始化”直到hashCode第一次被调用时才初始化。

重写equals:

  1. 使用==操作符检查“参数是否为这个对象的引用”;
  2. 使用instanceof检查“参数是否为正确地类型”;
  3. 把参数转换成正确地类型;
  4. 对于该类中的每个关键域,检查参数中的域是否与该对象中对应的域相匹配;
  5. 覆盖equals时总要覆盖hashcode;
  6. 不要将equals声明中的Object对象替换为其他的类型;

以下代码片段:

Object s1 = "Hello";
Object s2 = "Hello";
 
if (s1 == s2) {
    System.out.println("s1 and s2 are ==");
} else if (s1.equals(s2)) {
    System.out.println("s1 and s2 are equals()");
}
输出结果为:

s1 and s2 are ==

为什么会输出“s1 and s2 are ==”?事实上,这个例子比较特殊,是一个典型的flyweight 模式在字符串对象创建中的应用,这个模式通过减少对象的创建来节约内存。String对象会创建一个字符串池,如果当前准备新创建的字符串对象的值在这个池子中已经存在,那么就不会生成新对象,而是复用池中已有的字符串对象。flyweight 模式的精髓就是对象复用。不过,只有采用Object s = “Hello”方式(而非用”new“关键字)声明String对象的时候这个规则才会被应用。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值