集合-ArrayList与HashMap的区别
相同点:
都是线程不安全、不同步
都可以贮存null值
都是用size()方法获取元素的个数
不同点:
1)实现的接口
ArrayList实现了List接口(Collection(接口)->List(接口)->ArrayList(类)),底层使用的是数组;而HashMap现了Map接口(Map(接口)->HashMap(类)),底层使用的是Hash算法存储数据。
2)存储元素与重复性
ArrayList以数组的方式存储数据,里面的元素是有顺序,可以重复的;而HashMap将数据以键值对的方式存储,键的哈希码(hashCode)不可以相同,相同后面的值会将前面的值覆盖,值可以重复,里面的元素无序。
3)添加元素的方法
ArrayList用add(Object object)方法添加元素,而HashMap用put(Object key, Object value)添加元素。
4)默认的大小和扩容
在 Java 7 中,ArrayList的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。
ArrayList扩容增量:原容量的0.5倍+1,如 ArrayList的容量为10,一次扩容后是容量为16;
HashMap扩容增量:原容量的 1 倍,加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍时,进行扩容,如 HashSet的容量为16,一次扩容后是容量为32
5)使用场景:
如果需要快速随机访问元素,应该使用ArrayList。需要键值对形式的数据时,应该使用HashMap
为什么ArrayList查询快,增删慢:
因为ArrayList底层是数组实现的,根据下标查询不需要比较,查询方式为,首地址+(元素长度*下标),基于这个位置读取相应的字节数就可以了,所以非常快;增删会带来元素的移动,增加数据会向后移动,删除数据会向前移动,所以影响效率。