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实现的

总结

有不足之处请多多指教

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java入门1·2·3:一个老鸟的Java学习心得》是一本与众不同的Java入门好书。作者以独特的视角,向Java初学者讲述了如何才能真正理解和掌握Java语言。《Java入门1·2·3:一个老鸟的Java学习心得》充分考虑了初学Java语言的种种困难,讲解时细致入微,抽丝剥茧,层层推进,并采用对比、比喻和类比的方式讲解,还给出了大量的流程图帮助读者理解各种概念和程序的运行过程。另外,作者专门录制了近16小时的多媒体语音教学视频帮助读者直观地学习。这些视频和书中的源代码一起收录于《Java入门1·2·3:一个老鸟的Java学习心得》的DVD光盘中。 《Java入门1·2·3:一个老鸟的Java学习心得》分3篇。第1篇为Java语言基本语法,包括Java语言概述、配置开发环境、Java中的基本数据类型、Java运算符、Java流程控制语句和数组。第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP编程、Java UDP编程、Java Swing编程、JDBC编程,最后还给出了一个聊天程序实例和一个数据表操作窗口实例,将Swing、UDP、Java集合类、线程同步、接口和JDBC编程有机地结合起来,展示了开发一个简单程序的典型步骤。 《Java入门1·2·3:一个老鸟的Java学习心得》适合广大想学习一门编程语言的读者、没有任何基础的Java入门读者、Java自学人员、从其他语言转向Java语言的读者、大中专院校的学生和社会培训学生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值