java == equals hashcode 详解

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是指的当前对象存放入了那个检索中,跟内存是没有关系的.它所存放的篮子才是内存中的地址






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值