public boolean equals(Object obj){
if(this==obj){
return true ;
}
if(!(obj instanceof Person)){
return false ;
}
Person p = (Person)obj ;
if(this.name.equals(p.name)&&this.age==p.age){
return true ;
}else{
return false ;
}
}
帮我解释一下这段代码,谢了。。在线等啊
if(this==obj){
return true ;
}
if(!(obj instanceof Person)){
return false ;
}
Person p = (Person)obj ;
if(this.name.equals(p.name)&&this.age==p.age){
return true ;
}else{
return false ;
}
}
帮我解释一下这段代码,谢了。。在线等啊
在判断if(!(obj instanceof Person))是不是Person类的一个实例
如果是
判断this.name.equals(p.name)&&this.age==p.age
判断属性值是否相等,如果相等,返回true。则this equals o;
如果obj的类型不是Person或者Person的子类,就不具可比性,返回false
如果obj的name和age和this的name和age的用equals相等,则返回true
不属于以上情况就返回false
import java.util.Map ;
import java.util.HashMap ;
class Person{
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){
return "姓名:" + this.name + ";年龄:" + this.age ;
}
public boolean equals(Object obj){
if(this==obj){
return true ;
}
if(!(obj instanceof Person)){
return false ;
}
Person p = (Person)obj ;
if(this.name.equals(p.name)&&this.age==p.age){
return true ;
}else{
return false ;
}
}
public int hashCode(){
return this.name.hashCode() * this.age ;
}
};
public class HashMapDemo08{
public static void main(String args[]){
Map<Person,String> map = null ;
map = new HashMap<Person,String>() ;
map.put(new Person("张三",30),"zhangsan"); // 增加内容
System.out.println(map.get(new Person("张三",30))) ;
}
};
import java.util.Set ;
import java.util.HashSet ;
class Person{
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public boolean equals(Object obj){ // 覆写equals,完成对象比较
if(this==obj){
return true ;
}
if(!(obj instanceof Person)){
return false ;
}
Person p = (Person)obj ; // 向下转型
if(this.name.equals(p.name)&&this.age==p.age){
return true ;
}else{
return false ;
}
}
public int hashCode(){
return this.name.hashCode() * this.age ; // 定义一个公式
}
public String toString(){
return "姓名:" + this.name + ";年龄:" + this.age ;
}
};
public class RepeatDemo02{
public static void main(String args[]){
Set<Person> allSet = new HashSet<Person>() ;
allSet.add(new Person("张三",30)) ;
allSet.add(new Person("李四",31)) ;
allSet.add(new Person("王五",32)) ;
allSet.add(new Person("王五",32)) ;
allSet.add(new Person("王五",32)) ;
allSet.add(new Person("赵六",33)) ;
allSet.add(new Person("孙七",33)) ;
System.out.println(allSet) ;
}
};
Person a = new Person("张三",30);
Person b = new Person("张三",30);
System.out.println(a.equals(b));
楼主把equals方法注掉就会发现问题了。
没重写equals调用的是object 的equals方法,所以返回false;
重写了返回true;
应该是Set先调用equals比较是否重复,然后用hashcode进行排序吧。
return true ;
}
如果这个对象本身(就是你这段代码所在的那个类所实例出的对象)和你传入的那个object类型的对象obj是同一个储存地址,就返回return true,结束此方法。
注意:如果是同一个储存地址,就代表根本就是同一个对象,这个能理解吗?if(!(obj instanceof Person)){
return false ;
}
obj instanceof Person:测试传入的obj对象是否是Person的实例或者是Person子类的实例,如果是,这条语句的值就是true,那么此时](!(obj instanceof Person)的值就是false,反之则是true。也就是当obj不是Person或Person子类的实例是,方法会执行return false 并退出方法。Person p = (Person)obj ;
这是将obj强制转型为Person类对象。if(this.name.equals(p.name)&&this.age==p.age){
return true ;
}else{
return false ;
}
如果这个对象本身的成员变量name中的内容与p中的name相等(注意这是字符串中内容相等),并且这个对象本身的age与p的age相等(比较值大小),就return true,退出方法。否则,返回false退出方法。
public boolean equals(Object obj){
if(this==obj){//判断当前对象是否要比较的对象,如果是就反回真
return true ;
}
if(!(obj instanceof Person)){//判断比较对象是否是Person类型,否则反回假
return false ;
}
Person p = (Person)obj ; //将obj向下转型为Person
if(this.name.equals(p.name)&&this.age==p.age){//判断是否属性相同
return true ;//相同则是相等
}else{
return false ;//不同则不等
}
}
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
} modCount++;
addEntry(hash, key, value, i);
return null;
}
//源码:
hashSet中建了一个map,这是map的put方法。
先求出hash值,在取出set里面的每个元素,判断
hash是否相等,并且,对象引用地址是否相等,或者两者equals。