java 集合类的使用心得
前言
记录自己集合学习所有内容的一篇文章
二、Collection
1.hashMap使用分析不带源码
代码如下(示例):
public class test2 {
public static void main(String[] args) {
God xiaot=new God();
xiaot.name="小糖";
God xiaot2=new God();
xiaot2.name="小糖2";
God xiaot3=new God();
xiaot3.name="小糖2";
God xiaot4=new God();
xiaot4.name="小糖3";
God xiaot5=new God();
xiaot5.name="小糖4";
HashMap hashMap=new HashMap();
/**
* 注意值不是Value 而是key的内容,map存储跟v毫无关系
* 已经重写equals和hashcode
*/
System.out.println("测试1 同一个对象 但是值不同");
hashMap.put(xiaot,1);
xiaot.name="小糖修改";
System.out.println("修改成相同的再存");
hashMap.put(xiaot,2);
System.out.println(hashMap);
System.out.println("结论: 一个对象对的内容改后hashcode也随之改变,(正常情况),之所以会有两个相同的key是因为修改了,但是之前存储的hash数值位置不会发生改变" +
"同一个对象可以做多个key");
System.out.println("测试2 同一个对象 值相同");
hashMap.put(xiaot,-1);
System.out.println(hashMap);
System.out.println("结论: 同上结论可以得出首先判断出同一对象的值相同,也就是hash相同就会替换这个位置的kv");
System.out.println("测试3 不同对象 但是值相同");
hashMap.put(xiaot2,3);
hashMap.put(xiaot3,4);
System.out.println(hashMap);
System.out.println("结论: 不同对象值相同也就代表hashcode与equals相等,所以替换这个位置,不同点就是这个步骤会调用equals方法");
System.out.println("2,3测试也就是说: hashcode相同的不同对象会调用其与equals来判断其是否相等,相等就会覆盖,不相等就会添加");
System.out.println("测试4 不同对象 不同值");
hashMap.put(xiaot4,5);
hashMap.put(xiaot5,6);
System.out.println(hashMap);
System.out.println("结论: hashcode不同的对象完全是可以添加进去的的,同一对象相同,就会替换, 不同对象相同就会比较equals来判断");
System.out.println("其他: hashmap 使用数组加链表加红黑树(java8),数组(用于分类,有hash值确定位置)" +
"链表用于存储key-value,红黑树用于优化,链表长度大于8是转变,所以map是无序的,0.75扩容阈值,2倍扩容,使用时得注意其重写hashcode与equals,hashset是map的key实现的");
}
static class God{
public String name="小糖";
@Override
public String toString() {
return "a{" +
"name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
System.out.println("进入"+name+"equals");
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
God a = (God) o;
return Objects.equals(name, a.name);
}
@Override
public int hashCode() {
System.out.println("进入"+name+"hashCode");
return Objects.hash(name);
}
}
}
运行结果
测试1 同一个对象 但是值不同
进入小糖hashCode
修改成相同的再存
进入小糖修改hashCode
{a{name=‘小糖修改’}=2, a{name=‘小糖修改’}=1}
结论: 一个对象对的内容改后hashcode也随之改变,(正常情况),之所以会有两个相同的key是因为修改了,但是之前存储的hash数值位置不会发生改变同一个对象可以做多个key
测试2 同一个对象 值相同
进入小糖修改hashCode
{a{name=‘小糖修改’}=-1, a{name=‘小糖修改’}=1}
结论: 同上结论可以得出首先判断出同一对象的值相同,也就是hash相同就会替换这个位置的kv
测试3 不同对象 但是值相同
进入小糖2hashCode
进入小糖2hashCode
进入小糖2equals
{a{name=‘小糖2’}=4, a{name=‘小糖修改’}=-1, a{name=‘小糖修改’}=1}
结论: 不同对象值相同也就代表hashcode与equals相等,所以替换这个位置,不同点就是这个步骤会调用equals方法
2,3测试也就是说: hashcode相同的不同对象会调用其与equals来判断其是否相等,相等就会覆盖,不相等就会添加
测试4 不同对象 不同值
进入小糖3hashCode
进入小糖4hashCode
{a{name=‘小糖2’}=4, a{name=‘小糖3’}=5, a{name=‘小糖4’}=6, a{name=‘小糖修改’}=-1, a{name=‘小糖修改’}=1}
结论: hashcode不同的对象完全是可以添加进去的的,同一对象相同,就会替换, 不同对象相同就会比较equals来判断
总体: hashmap 使用数组加链表加红黑树(java8),数组(用于分类,由hash值确定位置)链表用于存储key-value,红黑树用于优化,链表长度大于8时转变,所以map是无序的,0.75扩容阈值,2倍扩容,使用时得注意其重写hashcode与equals,hashset是map的key实现的
总结
有不足之处请多多指教
本文地址:https://blog.csdn.net/Tang2468/article/details/111951935