==和equals区别
- ==用于基本数据类型,比较的是值,用于引用类型,比较的是对象的内存地址。
- java中只有值传递,因此对于引用类型,实际比较的引用的内存地址的值。
- equals不能用来判断基本数据类型,只能判断引用数据类型,判断两个对象是否相等。
java
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
System.out.println(aa == bb);// true
System.out.println(a == b);// false
System.out.println(a.equals(b));// true
System.out.println(42 == 42.0);// true
hashcode
- 把输入的值经过哈希算法得出哈希码,即散列码,用来确定对象在哈希表的索引位置。
hashCode()
定义在 JDK 的Object
类中,这就意味着 Java 中的任何类都包含有hashCode()
函数。另外需要注意的是:Object
的hashCode()
方法是本地方法,也就是用 C 语言或 C++ 实现的。
为什么JDK同时提供hashCode()
和 equals()方法
hashCode()
和equals()
都是用于比较两个对象是否相等。
- 为什么 JDK 还要同时提供这两个方法呢?
这是因为在一些容器(比如HashMap
、HashSet
)中,有了hashCode()
之后,判断元素是否在对应容器中的效率会更高(参考添加元素进HashSet
的过程)!
我们在前面也提到了添加元素进HashSet
的过程,如果HashSet
在对比的时候,同样的hashCode
有多个对象,它会继续使用equals()
来判断是否真的相同。也就是说hashCode
帮助我们大大缩小了查找成本。- 为什么不只提供
hashCode()
方法呢?
这是因为两个对象的hashCode
值相等并不代表两个对象就相等。- 那为什么两个对象有相同的
hashCode
值,它们也不一定是相等的?
因为hashCode()
所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的hashCode
)。