Java ==,equals ,hashCode 的比较


Java ==,equals ,hashCode 的比较


1.Java中的数据类型

基本数据类型: byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值即(他们在内存中存放的地址)。

<code>public static void main(String[] args) {
System.out.println("对象的比较@@@@@@@@@@@@@@@@@@@@@@@");
String str=new String("asda");
System.out.println(str==str); //true
}/<code>

如果是同一个new出来的对象,通过比较,结果是true, 对象存放在堆中,栈中存放的是对象的引(地址),由此可见是对栈中的值进行比较的,如果想比较堆中对象的内容是否相等,就需要重写equals的方法。

引用类型: 即包装类(String ,Date ,Interge,数组等)

代码说明:

<code>public static void main(String[] args) {
int a =1;
int b =1;
Integer integer1=new Integer(1);
Integer integer2=new Integer(1);

String str="aa";
String str1=new String("aa");

String str2=new String("aa");
System.out.println(a==b); //true
System.out.println(integer1==b); //true,自动拆箱int
System.out.println(str1==str2); //false ,在栈中存放的地址不同
System.out.println(str==str1); //false

}/<code>

2、equals的概述

默认情况:(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。

下面是Object类中equals方法:

<code> public boolean equals(Object obj) {
return (this == obj);
}/<code>

2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。下面是String类对equals进行了重写:

<code>public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])

return false;
i++;
}
return true;
}
}
return false;
} /<code>

3、hashCode

hashCode()方法返回的就是一个数值,从方法的名称上就可以看出,其目的是生成一个hash码。hash码的主要用途就是在对对象进行散列的时候作为key输入,据此很容易推断出,我们需要每个对象的hash码尽可能不同,这样才能保证散列的存取性能。事实上,Object类提供的默认实现确实保证每个对象的hash码不同(在对象的内存地址基础上经过特定算法返回一个hash码)。Java采用了哈希表的原理。

hashCode的作用

主要应用在Java 的号集合当中  

总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。

那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?

这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。

于是,Java采用了哈希表的原理。

这样一来,当集合要添加新的元素时,

先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。

如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;

如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

每天进步一丢丢

完成。


分享到:


相關文章: