1700445187
List<String>list=new ArrayList<String>();
1700445188
1700445189
/*Runtime增加的钩子函数相同,不再赘述*/
1700445190
1700445191
//放入40万同样字符串
1700445192
1700445193
for(int i=0;i<400000;i++){
1700445194
1700445195
list.add(“key”+i);
1700445196
1700445197
list.add(“vlaue”+i);
1700445198
1700445199
}
1700445200
1700445201
}
1700445202
1700445203
同样的程序,只是把HashMap修改成了List,增加的字符串元素也相同(只是HashMap将其拆分成了两个字符串,一个是key,一个是value,此处则是把两个字符串放到list中),我们来看运行结果:
1700445204
1700445205
最大可用内存:63M
1700445206
1700445207
对内存大小:63M
1700445208
1700445209
空闲内存:11M
1700445210
1700445211
ArrayList运行很正常,没有出现内存溢出情况。两个容器,容纳的元素相同,数量相同,ArrayList没有溢出,但HashMap却溢出了。很明显,这与HashMap内部的处理机制有极大的关系。
1700445212
1700445213
HashMap在底层也是以数组方式保存元素的,其中每一个键值对就是一个元素,也就是说HashMap把键值对封装成了一个Entry对象,然后再把Entry放到了数组中,我们简单看一下Entry类:
1700445214
1700445215
static class Entry<K, V>implements Map.Entry<K, V>{
1700445216
1700445217
//键
1700445218
1700445219
final K key;
1700445220
1700445221
//值
1700445222
1700445223
V value;
1700445224
1700445225
//相同哈希码的下一个元素
1700445226
1700445227
Entry<K, V>next;
1700445228
1700445229
final int hash;
1700445230
1700445231
/*key、value的getter/setter方法,以及重写的equals、hashCode、toString方法*/
1700445232
1700445233
}
1700445234
1700445235
}
1700445236
[
上一页 ]
[ :1.700445187e+09 ]
[
下一页 ]