上那个网站找手工活做,网站怎么做搜狗排名,建设银行网站,wordpress 鼠标悬停本人博客《HashMap、HashSet底层原理分析》#xff0c;可以了解hashmap的底层源码实现
测试代码
HashSet底层实际就是一个Hashmap。猜猜下面源码每一个打印结果。 注#xff1a;user对象重写的hashcode方法#xff0c;保证name和age一样的情况下hashcode是一样的#xff…本人博客《HashMap、HashSet底层原理分析》可以了解hashmap的底层源码实现
测试代码
HashSet底层实际就是一个Hashmap。猜猜下面源码每一个打印结果。 注user对象重写的hashcode方法保证name和age一样的情况下hashcode是一样的
import java.util.*;public class HashmapTest {public static void main(String[] args) {HashMap map new HashMap();User u1 new User(AA);User u2 new User(BB);map.put(u1,1);map.put(u2,2);System.out.println(结果一(put u1 u2 后)map);// u1 重新Set nameu1.setName(CC);System.out.println(结果二(u1 set name 后)map);// 移除 u1map.remove(u1);System.out.println(结果三(remove u1 后)map);// put user(CC)map.put(new User(CC),3);System.out.println(结果四(put user(CC) 后)map);// put user(AA)map.put(new User(AA),4);System.out.println(结果五(put user(AA) 后)map);}
}class User{private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public int getAge() {return age;}public void setAge(int age) {this.age age;}public User(String name, int age) {this.name name;this.age age;}public User(String name) {this.name name;}public User() {}Overridepublic String toString() {return User{ name name \ , age age };}Overridepublic int hashCode() {return Objects.hash(name, age);}
}测试结果
结果一(put u1 u2 后){User{nameBB, age0}2, User{nameAA, age0}1}
结果二(u1 set name 后){User{nameBB, age0}2, User{nameCC, age0}1}
结果三(remove u1 后){User{nameBB, age0}2, User{nameCC, age0}1}
结果四(put user(CC) 后){User{nameBB, age0}2, User{nameCC, age0}3, User{nameCC, age0}1}
结果五(put user(AA) 后){User{nameBB, age0}2, User{nameCC, age0}3, User{nameCC, age0}1, User{nameAA, age0}4}分析
结果一和结果二属于Java基础
结果三分析
结论并没有移除u1成功。
map.remove(u1);1、了解put方法做了哪些事 map.put(u1,1); 第一次put时数组下标、Node节点中保存的hash均是通过new User(“AA”)计算并保存的 2、SetName后该节点中保存了什么 u1.setName(“CC”); SetName时只改变了值Node节点在数组中的位置、Node节点中保存的hash值均还是new User(“AA”)的 3、了解map是怎么实现remove remove和put是类似的通过remove传入的对象经过计算下标然后和该下标内的数据进行比对(hash值相等 且 ( 或 equals))。 原Node在数组中下标、Node内hash值均保存的是new User(“AA”)但是remove传入的却是CC就算下标一样hash值肯定是不一样的所以并不会移除u1对象
结果四分析
结论成功put。
map.put(new User(CC),3);1、通过结果三分析已经知道put时做了那些事就算Hash计算的下标一样hash值和目前存在的数据肯定是不一样的所以是可以正常加入的。 2、假设计算后下标一致u1 节点保存的hash值是AA的结果四put的是CC的hash所以肯定不一样此时是可以正常加入的
结果五分析
结论成功put。
map.put(new User(AA),4);1、通过结果三分析已经知道remove时做了那些事,实际put也一样hash冲突(下标相等)时hash值相等 且 ( 或 equals)时才会认为是相等的 2、此时put进去的new User(“AA”)和原保存进去的u1两者hash冲突(因为user对象重新了hashcode方法hashcode是一样的计算后的下标是一样的)hash值也相等(都是AA的)但是u1实际保存的Name是CC不论是还是equals均返回的是false所以也是可以正常put进去的