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值不同
测试代码如下