Java4Android(第44~45集)equals、hashCode、toString

第44集 equals函数的作用
本集主要内容.
  1. equals函数在什么地方.
  2. equals函数的作用.
  3. 复写equals函数的方法.
  a.  equals被包含在object中,object是所有类的父类.       所以所有类都继承了equals方法.
 b.  双等号的作用,判断两个引用是否指向堆内存中的同一块地址.或者    是同一个对象.
equals函数的作用.是来比较两个对象的内容是否相等.
     在通常情况下两个对象内容是否相等.要符合两个条件
     a. 对象类型相同(可以使用instanceof操作符进行比较).
     b. 两个对象成员变量的值完全相同.
class User{
	 String name;
	 int    age;
	 
	 public boolean equals(Object obj){
	 	if(this == obj){
	 		return true;		
	 	}
	 	
	 	boolean b = obj instanceof User;   //判断obj是不是User类型
	 	if(b){
	 		User u = (User)obj;       //obj向下转型为User类型
	 		if(this.age == u.age && this.name.equals(u.name)){
	 			return true;
	 		}
	 		else{
	 			return false;
	 		}
	 	}
	 	else{
	 		return false;
	 	}
	 }
}
//*********************************************************************************************//
class Test{
	public static void main(String args[]){
		User u1 = new User();
		User u2 = new User();
		User u3 = new User();
		
		u1.name = "zhangsan";
		u1.age  = 12;
		
		u2.name = "lisi";
		u2.age  = 12;
		
		u3.name = "zhangsan";
		u3.age  = 12;
		
		System.out.println(u1.equals(u2));
		System.out.println(u1.equals(u3));
		//User u3 = u1;
		
		//boolean b1 = u1 == u2;
		//boolean b2 = u1 == u3;
		
		//System.out.println(b1);
		//System.out.println(b2); 
		
		//boolean b1 = u1.equals(u2); 
		//System.out.println(b1);
	}
	
}
this.name.equals(u.name)     这里的equals 是用name来调用的,name是String类型的。这里不再用‘==’ 是因为String是引用数据类型,而‘==’的作用是判断 两个引用 是否指向堆内存中的同一块地址,不是不需要指向同一块地址,只要内容是相同就可以。
所以,比较基本数据类型的成员变量用‘==’,比较引用类型的成员变量用equals .

第45集 java当中的hashCode()与toString()
hashCode() 与 toString()   同equals 方法一样,都 被包含在object中.
1.   什么是hash算法. 
    任意长度数据 =====>(hash算法)====>散列值(固定长度)
简单说就是:输入一个任意长度的二进制数据,经过hash算法之后,得到一个固定长度唯一的散列。
哪怕是输入就变一个字节,得到的散列也大相径庭。而同一个输入,无论算多少遍,得到的都是相同的。
2. hash算法的特点
   输入1  ===============>>散列值1
   输入2  ===============>>散列值2
   输入3  ===============>>散列值3
可以在输入值与散列值建立起一个对应关系,用于存贮数据。
可以把它理解为住宅的门牌号,这样通过散列值可以方便的找到输入值。
如果两个对象用 equals  方法比较为true,那么这两个对象分别调用 hashCode 方法,得到的值应该也是一样的。
  所有的类都拥有hashCode()方法.都是object里面的.
   hascCode()广泛用于类型框架.
代码:
class User{
     String name;
     int    age;
     
     public User(String name , int age){
        this.name = name;
        this.age  = age;
     }
     
     public boolean equals(Object obj){
        if(this == obj){
            return true;        
        }
        
        boolean b = obj instanceof User;
        if(b){
            User u = (User)obj;
            if(this.age == u.age && this.name.equals(u.name)){
                return true;
            }
            else{
                return false;
            }
        }
        else{
            return false;
        }
     }
     
     public int hashCode(){
        int result = 17;
        result  = 31*result + age;
        result  = 31*result + name.hashCode();
        
        return result;
    }
    
    public String toString(){
        String result = "";
        result = result + "age:" +age +"," +"name:"+name;
        return result;
    }   
}
//***************************************************************************//
import java.util.*;

class Test{
    public static void main(String args[]){
        User u = new User("zhangsan",20);
        
        //HashMap<User,String> map = new HashMap<User,String>();
        //map.put(u,"abc");
        //String s = map.get(new User("zhangsan",12));
        //System.out.println(s);
        
        System.out.println(u);
    }
    
}
User u = new User("zhangsan",20);     
 System.out.println(u);                       它会去执行user的toString方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值