Java基础之==andequals

  • Post author:
  • Post category:java


==和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方法。



版权声明:本文为qq_33861603原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。