ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ArrayList和HashMap的比较

2022-05-26 22:35:10  阅读:153  来源: 互联网

标签:遍历 hashMap ArrayList 元素 key 比较 HashMap


转载

ArrayList和HashMap是Java项目开发中经常用到的容器,下面来比较一下两者之间的区别!

例子:

//ArrayList

ArrayList array = new ArrayList();
array.add("张三");
array.add("李四");
array.add("王五");
System.out.println("ArrayList的元素个数为:"+array.size());

//遍历方法一:通过迭代器Iterator进行遍历
Iterator iter = array.iterator();
while(iter.hasNext()){
String name = (String)iter.next();
System.out.println(name);
}
//遍历方法二:使用for循环遍历
for(int i=0;i<array.size();i++){
System.out.println(array.get(i));
}

//HashMap

HashMap hashMap = new HashMap();
hashMap.put("name", "张三");
hashMap.put("name1", "李四");
hashMap.put("name2", "王五");
System.out.println("HashMap的元素个数为:"+hashMap.size());

//遍历方法一:hashMap.entrySet()方法,通过迭代器Iterator进行遍历 效率高,推荐使用
Iterator iter1 = hashMap.entrySet().iterator();
while(iter1.hasNext()){
Map.Entry name = (Map.Entry)iter1.next();
String nameKey = (String)name.getKey();
String nameValue = (String)name.getValue();
System.out.println(nameKey + "'s name is " + nameValue);
}

//遍历方法二:hashMap.keySet()方法,通过迭代器Iterator进行遍历 效率低,不推荐使用
Iterator iter2 = hashMap.keySet().iterator();
while (iter2.hasNext()) {
Object key = iter.next();
Object val = hashMap.get(key);
}

//遍历方法三:foreach方法来遍历keyset,和第二种没有什么区别
Set keySet = hashMap.keySet();
for(Object key: keySet) {
System.out.print("[key=" + key + ",value=" + hashMap.get(key) + "] ");
}

//遍历方法四:java8中新增方法forEach。
hashMap.forEach((key,value) -> {
System.out.print("[key=" + key + ",value=" + value + "] ");
});

相同点:

1)都是线程不安全,不同步

2)都可以储存null值

3)获取元素个数方法一样,都用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源码

/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
//HashMap源码

/**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
ArrayList扩容增量:原容量的0.5倍+1,如 ArrayList的容量为10,一次扩容后是容量为16;

HashMap扩容增量:原容量的 1 倍,加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍时,进行扩容,如 HashSet的容量为16,一次扩容后是容量为32

使用场景:

如果需要快速随机访问元素,应该使用ArrayList。需要键值对形式的数据时,应该使用HashMap

补充内容:

加载因子是表示Hash表中元素的填满的程度.若加载因子越大,填满的元素越多,好处是空间利用率高了,但冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是冲突的机会减小了,但空间浪费多了.冲突的机会越大,则查找的成本越高.反之,查找的成本越小.因而,查找时间就越小.因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷.当元素个数超过 容量长度*加载因子的系数 时,会进行扩容。


————————————————
版权声明:本文为CSDN博主「逸致hjm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yaodieteng1510/article/details/79582925

标签:遍历,hashMap,ArrayList,元素,key,比较,HashMap
来源: https://www.cnblogs.com/momoyou/p/16315459.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有