import java.util.HashMap;
import java.util.Map;
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public String toString() {
return this.name+"的年龄是"+this.age;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
if (!(obj instanceof Person))
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}public class HashMapdemo { public static void main(String[] args) {
Map<Person,String> m=null;
m=new HashMap<Person,String>();
Person per=new Person(13,"张三");
m.put(per,"1");
System.out.println(m.get(per));
System.out.println(m.get(new Person(13,"张三")));
per.setAge(14);
System.out.println(m.get(per));
System.out.println(m.get(new Person(13,"张三")));
System.out.println(m.get(new Person(14,"张三")));
System.out.println(m);
}}
最后的输出是:
1
1
null
null
null
{张三的年龄是14=1}请问问什么修改了作为key的per的值后 就无法用per以及匿名对象找到value了呢??
是不是和hashcode有关的?
import java.util.Map;
class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public String toString() {
return this.name+"的年龄是"+this.age;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
if (!(obj instanceof Person))
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}public class HashMapdemo { public static void main(String[] args) {
Map<Person,String> m=null;
m=new HashMap<Person,String>();
Person per=new Person(13,"张三");
m.put(per,"1");
System.out.println(m.get(per));
System.out.println(m.get(new Person(13,"张三")));
per.setAge(14);
System.out.println(m.get(per));
System.out.println(m.get(new Person(13,"张三")));
System.out.println(m.get(new Person(14,"张三")));
System.out.println(m);
}}
最后的输出是:
1
1
null
null
null
{张三的年龄是14=1}请问问什么修改了作为key的per的值后 就无法用per以及匿名对象找到value了呢??
是不是和hashcode有关的?
我的意思是用Person的对象per作为了Map的key 然后修改了per 发现用per不能找到value了 然后用匿名对象 无论是修改前的 还是修改后的也找不到了...不知道是不是哪里写错了
和hashcode以及 equals方法有关public class HashMapdemo { public static void main(String[] args) {
Map<Person,String> m=null;
m=new HashMap<Person,String>();
Person per=new Person(13,"张三");
m.put(per,"1"); System.out.println(m.get(per));//1
System.out.println(m.get(new Person(13,"张三")));//1
per.setAge(14); System.out.println(m.get(per));//m当中的per的位置你放进去的时候是由(13,"张三")确定的,现在由(14,"张三")确定的位置上当然什么也没有了
System.out.println(m.get(new Person(13,"张三")));// 虽然位置是找对了。但是由 public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}可以看出还要判断是不是同一个对象,或者内容相等。new Person(13,"张三");都不满足
System.out.println(m.get(new Person(14,"张三")));//m当中的per的位置你放进去的时候是由(13,"张三")确定的,现在由(14,"张三")确定的位置上当然什么也没有了
System.out.println(m);
}}
{
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
楼主仔细看重写的hashCode方法,跟age有关,你重新设置了age的值,hashCode就变了
所以的得出结论,跟hasCode有关,你可以按住ctrl键不懂点击m.get()方法去查看一下源码