HashMap 非线程安全
通过下图可以看出HashMap的get方法的实现,其判断标准是通过hashCode和equals方法。
故可以通过重写类的hashCode和equals方法实现自定义Object的相等标准,完整代码如下
Book.java
package com.shc.map;
public class Book {
private String title;
public Book(String title) {
super();
this.title = title;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public int hashCode() {
return title.hashCode();
}
@Override
public boolean equals(Object obj) {
boolean flag = false;
if(obj instanceof Book){
Book book = (Book)obj;
flag = this.title.equals(book.title);
}
return flag;
}
}
HashMapTest.java
package com.shc.map;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
public class HashMapTest {
@Test
public void testHashMap1(){
Map map = new HashMap();
String sss = "aaa";
String yyy = "bbb";
Book aaa = new Book(sss);
Book bbb = new Book(yyy);
map.put(aaa, "aaaaaaaaaaaaaaaaaa");
map.put(bbb, "bbbbbbbbbbbbbbbbbb");
Object content = map.get(aaa);
//输出aaaaaaaaaaaaaaaaaa
System.out.println(content);
//改变对象的属性,其hashCode不变,对象内存地址不变
aaa.setTitle("xwegwear");
content = map.get(aaa);
//输出aaaaaaaaaaaaaaaaaa
System.out.println(content);
//hashCode不同
Book ccc = new Book(yyy);
content = map.get(ccc);
//输出null
System.out.println(content);
}
/**
* 重写了book的hashCode和equals方法之后
*/
@Test
public void testHashMap2(){
Map map = new HashMap();
String sss = "aaa";
String yyy = "bbb";
Book aaa = new Book(sss);
Book bbb = new Book(yyy);
map.put(aaa, "aaaaaaaaaaaaaaaaaa");
map.put(bbb, "bbbbbbbbbbbbbbbbbb");
Object content = map.get(aaa);
//输出aaaaaaaaaaaaaaaaaa
System.out.println(content);
//改变对象的属性
aaa.setTitle("xwegwear");
//map.get时,获取到的aaa的hashCode已经改变,已经取不到aaa
content = map.get(aaa);
//输出null
System.out.println(content);
//hashCode相同
Book ccc = new Book(yyy);
content = map.get(ccc);
//输出bbbbbbbbbbbbbbbbbb
System.out.println(content);
//字符串"bbb" 和 变量yyy 的hashCode相同
Book ttt = new Book("bbb");
content = map.get(ttt);
//输出bbbbbbbbbbbbbbbbbb
System.out.println(content);
}
}