欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 集合类的使用心得

程序员文章站 2022-06-28 07:58:58
文章目录前言二、Collection1.hashMap使用分析不带源码总结前言记录自己集合学习所有内容的一篇文章二、Collection1.hashMap使用分析不带源码代码如下(示例):public class test2 { public static void main(String[] args) { God xiaot=new God(); xiaot.name="小糖"; God xiaot2=new God();...

前言

记录自己集合学习所有内容的一篇文章

二、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