第44集 equals函数的作用
本集主要内容.
1. equals函数在什么地方.
2. equals函数的作用.
3. 复写equals函数的方法.
a. equals被包含在object中,object是所有类的父类. 所以所有类都继承了equals方法.
b. 双等号的作用,判断两个引用是否指向堆内存中的同一块地址.或者 是同一个对象.
equals函数的作用.是来比较两个对象的内容是否相等.
在通常情况下两个对象内容是否相等.要符合两个条件
a. 对象类型相同(可以使用instanceof操作符进行比较).
b. 两个对象成员变量的值完全相同.
所以,比较基本数据类型的成员变量用‘==’,比较引用类型的成员变量用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()广泛用于类型框架.
代码:
System.out.println(u); 它会去执行user的toString方法。
本集主要内容.
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方法。