java.util.HashMap中的key为对象的问题,对象key获得相应的value值
重写对象key的equals和hashCode的方法
package com;
import java.util.HashMap;
import java.util.Map;
public class AMain {
public static void main(String[] args) {
Map<User, Integer> map = new HashMap<>();
String name = "aa";
// String name1 = "aa";
// System.out.println(name.hashCode());
// System.out.println(name1.hashCode());
Integer age = 123;
Integer result = null;
User u1 = new User();
u1.setName(name);
u1.setAge(age);
map.put(u1, 1000);
result = map.get(u1);
System.out.println(result);
User u2 = new User();
u2.setName(name);
u2.setAge(age);
result = map.get(u2);
System.out.println(result);
result = map.get(u1);
System.out.println(result);
}
}
package com;
public class User {
private String name;
private Integer age;
@Override
public boolean equals(Object obj) {
boolean result = false;
if (this == obj)
result = true;
if (obj == null || getClass() != obj.getClass())
result = false;
User user = (User) obj;
if (user.getName() == null || user.getAge() == null)
result = false;
if (user.getName().equals(name) && user.getAge().equals(age))
result = true;
System.out.println("equals:" + result);
return result;
}
@Override
public int hashCode() {
int a = 0;
if (name != null && age != null) {
a = name.hashCode() + age.hashCode();
}
if (name != null) {
a = name.hashCode();
}
if (age != null) {
a = age.hashCode();
}
System.out.println("hashCode:" + a);
return a;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
原因:
/**
* Implements Map.get and related methods
*
* @param hash hash for key
* @param key the key
* @return the node, or null if none
*/
final Node<K,V> getNode(int hash, Object key) {
Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
if ((tab = table) != null && (n = tab.length) > 0 &&
(first = tab[(n - 1) & hash]) != null) {
if (first.hash == hash && // always check first node
((k = first.key) == key || (key != null && key.equals(k))))
return first;
if ((e = first.next) != null) {
if (first instanceof TreeNode)
return ((TreeNode<K,V>)first).getTreeNode(hash, key);
do {
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
} while ((e = e.next) != null);
}
}
return null;
}
HashMap在根据key获得相应的value的时候,用的hash值和equals来判断是否是同一个key