android 文件中加载hashmap android hashmap扩容_键值对


大家好,昨天我们聊了聊hashmap的底层数据结构,以及产生hash冲突时的应对机制和hashmap扩容的机制等;

今天,我和大家来聊一聊HashMap在数据存储容量上的一些注意事项以及容量的计算问题:

众所周知,map以键值对的行书存储数据(key,value); 是通过put方法将需要存放的键值对,存入map中。最常见的形式就是----map.put("a", "AAA"); 但是如果问你:

HashMap<String, String> map=new HashMap<>();

System.out.println(map.put("a", "AAA"));

上面新建一个map 然后输出什么,相比有些朋友就不知道该输出什么了?这就是在日常中,我们往往需要put方法存放数据,但并不常用put方法的返回值;其实put方法是有返回值的,返回key键对应存放之前的数据,由于上面的map是new出来的 初始值都为null 所以上面的额结果是输出null;

我们可以通过put方法存放数据,但一个map能存放多少数据呢? 很多,因为map有自动扩容机制,是的。但是在不扩容的情况下 一个map能放多少呢? 这与map此时的容量和加载因子就有关系了:

map扩容的话,需要满足俩个条件-----1)容量 >= 现有容量 * 加载因子

2) 将要put进去的数据(key)产生hash冲突了;

我们举一个例子:HashMap<String, String> map=new HashMap<>();

默认初始容量为2的4次幂 加载因子0.75 问这样一个map在不扩容的情况下能put最多多少个键值对?

怎么才能put进去尽量多 而 map还不扩容嗯?

根据上面的俩个条件我们知道,最好在 第一个条件没满足的情况下 尽量put的元素都产生冲突,这样就在数组的一个index位置下,多少放数据, 那么能放多少呢?

0.75 * 16 =12 最多11个; 好了 这时候就不能再在这个位置put数据了,再放俩个条件就都满足了--扩容了! 所以其他键值对都放在数组其他的index上且每个index位置只能放一个,剩下15 放15组键值对, 所以上面的问题是 在不扩容的情况下方26个键值对;

显示生产中像上面的额情况基本不可能发生;那咱们就说一个有可能发生的案例吧?

hashmap的扩容需要耗费资源和时间的,为了在已运行的程序中对一个已知要存放100个键值对的map不再进行扩容,需要在项目启动时,初始化这个map的容量,问在初始化时,建议将这个map的容量设置大(默认加载因子0.75)?

一个道理,hashmap的容量是2的N次幂 100个元素 2-4-6-8----64----128

128 好像可以放下100个,是的好像可以,但也有可能不可以,这要看数据在map中怎么放,如果100个元素在put过程中都不产生冲突,也就是需要数组100个位置,由于加载因子是0.75 128*0.75 <100 有可能放不下的。 所以为了保证放入100个键值对且肯定不扩容,需要初始值设为258 258*0.75 肯定大于100了 怎么放都不会扩容了? 对吧?