网站的支付系统怎么做,北京高端网站建设费用,麻涌网站建设公司,山东济南seo优化HashMap的实现原理及其特点
2018年03月15日 20:43:08 阅读数#xff1a;11045更多
个人分类#xff1a; Java基础知识点
版权声明#xff1a;本文为博主原创文章#xff0c;未经博主允许不得转载。 https://blog.csdn.net/lovewebeye/article/details/79573702
1) Hash…HashMap的实现原理及其特点
2018年03月15日 20:43:08 阅读数11045更多
个人分类 Java基础知识点
版权声明本文为博主原创文章未经博主允许不得转载。 https://blog.csdn.net/lovewebeye/article/details/79573702
1) HashMap可以接受null键值和值而HashTable则不能HashMap是非synchronized的存储的是键值对。
2) HashMap是基于hashing原理,使用put(key,value)存储对象到HashMap中使用get(key)从HashMap中获取对象当我们给put方法传递键和值时我们先对键调用hashCode()方法返回的hashCode用于找到bucket位置来存储键对象和值对象作为Map.Entry. 3) 如果两个对象hashCode相同
存储时他们会找到相同的bucket位置发生碰撞因为HashMap使用链表存储对象每个Map.Entry都有一个next指针这个Entry会存储在链表中。
获取时:会用hashCode找到bucket位置然后调用key.equals()方法找到链表中正确的节点.最终找到要找的值对象.
减少碰撞使用final修饰的对象、或不可变的对象作为键使用(Integer、String)是不可变、final的,而且已经重写了equals和hashCode方法这样的wrapper类作为键是非常好的我们可以使用自定义的对象作为键吗答当然可以只要它遵守了equals和hashCode方法定义规则并且当对象插入到Map中之后将不会再改变。
4) HashMap负载因子默认是0.75可设置当map填满了75%的bucket时候将会创建原来HashMap大小两倍的bucket数组来重新调整map的大小并将原来的对象放入新的bucket数组中,这个过程叫做rehashing因为它调用hash方法找到新的bucket位置。
5) 重新调整map大小可能会发生竞争问题如果两个线程都发现HashMap需要调整大小了它们都会尝试进行调整在调整中存储在链表中的元素的次序会反过来因为移动bucket位置的时候HashMap并不会将元素放在链表的尾部而是放在头部这是为了避免尾部遍历如果条件竞争发生了就死循环了。