Map源码跟踪

HashMap

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

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

1 put方法

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

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

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

④数组内容复制

⑤自动扩容之后就增加元素

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

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值不同

测试代码如下

猜你喜欢

转载自my.oschina.net/u/3739402/blog/1647810
今日推荐