equals && == —— hashCode

堆:顺序随意——引用类型的变量——存储引用类型变量的地址
栈:后进先出——值类型
 

堆和栈的区别

  • 功能不同

    • 栈内存用来存储局部变量和方法调用。
  • 而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。

  • 共享性不同

    • 栈内存是线程私有的。
    • 堆内存是所有线程共有的。
  • 异常错误不同

    如果栈内存或者堆内存不足都会抛出异常。

    • 栈空间不足:java.lang.StackOverFlowError。
    • 堆空间不足:java.lang.OutOfMemoryError。
  • 空间大小

    栈的空间大小远远小于堆的。



==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

==比较的是2个对象的地址,而equals比较的是2个对象的内容
 
hashcode返回该对象的哈希码值,即对象在JVM虚拟出来的内存地址,不是实际物理内存地址
 
1、如果两个对象相同,那么它们的hashCode值一定要相同; 
2、如果两个对象的hashCode相同,它们并不一定相同 
 
重写equals方法的时候必须重写hashCode方法。如果一个类的两个对象,使用equals方法比较时,结果为true,那么该两个对象具有相同的hashCode。原因是equals方法为true,表明是同一个对象,它们的hashCode当然相同。
 
在java的集合中,判断两个对象是否相等的规则是:
首先,判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等
如果相等,则判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等
我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率

 

对象的某个属性相同,他们即相同
equals和==的区别  hashCode - DaySpring - DaySpring的博客
 
 

 

posted on 2018-08-29 16:25  xiaowater  阅读(101)  评论(0)    收藏  举报

导航