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有关的? 

解决方案 »

  1.   

    长的是Person类 重要的是最后面几段 而且 Person类里面就只是覆写了写方法 还有常规的set get方法而已啊~~~
    我的意思是用Person的对象per作为了Map的key 然后修改了per 发现用per不能找到value了 然后用匿名对象 无论是修改前的 还是修改后的也找不到了...不知道是不是哪里写错了
      

  2.   

    是不是和hashcode有关的?  
    和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);
        }}
      

  3.   

    map 中的key需要不可变Immutable,像 String、Integer之类。
      

  4.   

    和hashCode有关, 你改变了对象的值,对象的hashCode也改变了,所以,使用新的hashCode找不到原有的对象了,如果,在你的代码里后面再加一句: per.setAge(13); 把原来的值再设置回来,就又可以了详情参见HashMap的实现
      

  5.   

    public int hashCode()
    {
    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()方法去查看一下源码
      

  6.   

    Map 的文档里说的很清楚:
      

  7.   

    你得先了解hashmap的实现原理。要不然说什么也白说
      

  8.   

    HashMap判断两个对象是否相等是通过判断hashCode()和equals两种方法,只有两个都通过才算相等.
      

  9.   

    hashmap可以看成是有很多个桶子,是先根据hashcode找到相对的桶子,然后再和桶子里面的东西比较equals。如果相等就不存进去,不相等就存进去。你中途改值了,查找的时候hashcode就改变了,所以会很大可能会找别的桶子。找不到,所以就杯具了。放进去了别改变里面的值,要不然,内存泄露。