Java基础之==andequals

==和equals方法是个用的多个方法。

1.==的分析

对基本数据类型来说,变量的内存地址里存的就是值,所以==在这里比较的值是否相等。

对引用类型来说,==比较的是引用变量地址里存的值是被引用对象的内存地址。

 

2.equals

比如引用类型中的String,重写了equals比较了值是否相等,也重写了hashcode。  






String str1 = new String("sss");
String str2 = new String("sss");


str1==str2  结果:false,比较的两个不同对象的地址,当然不同了
str1.equals(str2)  结果: true,值都相同


String str3 = "sss";
String str4 = "sss";

str3==str4 结果:true  这里有常量池概念,当这样定义变量时,首先去常量池看有没有该值,若有则直接指向该值,所以两者其实地址一样的
str3.equals(str4) 结果: true  值肯定的

比较
str3==str1  结果: false ,常量池是在方法区的,而new对象是在堆里的,所以两者地址肯定不一样
str3.equals(str1) 结果:true 肯定等

 

Object类有equals也有hashcode,hashcode有啥用?

hashcode主要两个好处:

1.映射元素在内存的地址(就是确定放在哪个地方)(相当于hashCode等于对象地址)

2.元素多时,减少了equals比较

 

举个例子:hashmap存元素,为啥元素的key为必须是引用类型

因为hashmap是根据key的hashCode来做hash运算的,而基本类型不存在hashCode.

hashmap源码的get方法,int h = hash(key.hashCode());

若key只实现equals重写,而hashCode没有,则无法判断取出的对象就一定是同一个元素,因为hashCode可能相等也可能不。

举个例子

public class Dog{
   
   private String name;
   
   private int age;

   public Dog(String name,int age){
     this.name = name;
     this.age = age;
   }

   public String getName(){
      return name;
   }
   public boolean equals(Object dog){
      return this.name.equals((Dog)dog.getName());
}
public class TestMap{
   
   public static void main(String[] args){
     Map<Dog,Integer> map = new HashMap<>();

     Dog dog1 = new Dog("sss",12);
     
     map.put(dog1,1);

     System.out.println(map.get(new Dog("sss",12)));  //输出结果为null
}



   

上面结果就很奇怪了,为啥找不到元素,equals肯定相等的。这里关键就在于这里是两个Dog对象,没有重写hashCode的情况下肯定是不同的,而map的get方法主要在于元素key的hashCode值,通过这个定位元素位置的,所以必须重写对象的hashCode方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值