Map源码跟踪

HashMap数组

        HashMap其实就是内部列Entry类型的数组---Entry<K,V> table安全

在这里看几个问题 1HashMap如何存数据(包括如何自动扩容)  2 Map如何取出数据 3 如何删除数据测试

1 put方法spa

   ①首先经过hash(Object key)生产hash值,而后indexFor()的位运算计算出value存放在数组的下标线程

  ②在新增元素以前先判断集合中的元素及table数组中的元素是否达到了数组容量的0.75,若是达到就扩容,其中0.75能够在实例化对象指定对象

 ③自动扩容建立一个新的长度的数组对象,而后把旧数组的元素一个一个的复制到新数组。rem

④数组内容复制get

⑤自动扩容以后就增长元素同步

2  get方法:根据key获取数据hash

3  remove(Object key)

   

总结

       1 HashMap本质就是一个数组,经过hash(Object key)方法根据key来生成hash值,而后经过位运算运算出数组的下标,再经过下标实现数据的增删改查。

        2 HashTable和HashMap的区别

          ①相同点:实现思路和代码逻辑如出一辙

         不一样点:

           ① HashTable的put方法、get方法等都使用synchronized关键字加入同步锁保证线程安全

           ② 两个自动扩容的方法名不同

           ③HashMap把增长元素的代码封装到一个方法,HashTable直接写在put方法

注意点:

            关于hash值的生成

1 若是key是String类型的,则只有内容相同,无论是否同一个对象,则生成的hash值都是同样的

2 若是key不是String类型,对象不同则hash值不一样

测试代码以下

 

 

相关文章
相关标签/搜索