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);
- }
- }