A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同;当用于引用类型的时候,是比较对象是否相同,就是比较对象中所存的地址即只想栈中的值得地址是否相同
java 基本类型 :一个数字,一个字符或一个布尔值 (基本类型没有equals方法)
java 引用类型 : 是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值
B.一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同
C.对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的
D.总之,"=="和"!="比较的是地址即这个地址指向了栈中的一个值.也可认为"=="和"!="比较的是对象句柄;而equals()比较的是对象内容.或者说,,"=="和"!="比较的是"栈"中的内容,而equals()比较的是"堆"中的内容.
E.String 重写了equals()这个方法,在调用这个的时候,比较的是两个值是否相等
下面一个测试代码说明这个
public class Test {
public static void main(String[] args) {
Integer p = 1;
Integer q = 1;
Integer i = new Integer(1);
Integer j = new Integer(1);
if(p == q){
System.out.println("integer:p == q"); //实际结果
}else{
System.out.println("integer:p != q");
}
if(p.equals(q)){
System.out.println("integer:p.equals(q)"); //实际结果
}else{
System.out.println("integer:p.equals(q)");
}
if(i == j){
System.out.println("int:i == j");
}else{
System.out.println("int:i != j"); //实际结果
}
if(i.equals(j)){
System.out.println("integer:i.equals(j)");//实际结果
}else{
System.out.println("integer:!i.equals(j)");
}
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
if(a == b){
System.out.println("abc对象相等"); //实际结果
}else{
System.out.println("abc对象不相等");
}
if(a.equals(b)){
System.out.println("ab相等"); //实际结果
}else{
System.out.println("ab不相等");
}
if(c.equals(d)){
System.out.println("cd相等"); //实际结果
}else{
System.out.println("cd不相等");
}
if(c == d){
System.out.println("cd对象相等");
}else{
System.out.println("cd对象不相等"); //实际结果
}
}
}
F.hashcode
1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
2、如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。
下面一个测试程序说明一切
public class HashTest {
private int i;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public int hashCode() {
return i % 10;
}
public final static void main(String[] args) {
HashTest a = new HashTest();
HashTest b = new HashTest();
a.setI(1);
b.setI(1);
Set<HashTest> set = new HashSet<HashTest>();
set.add(a);
set.add(b);
System.out.println(a.hashCode() == b.hashCode());
System.out.println(a.equals(b));
System.out.println(set);
}
}
输入结果
true
false
[com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]
说明:hashcode是指的当前对象存放入了那个检索中,跟内存是没有关系的.它所存放的篮子才是内存中的地址