日期:2014-05-20  浏览次数:20678 次

ArrayList与HashMap的疑问,明天结贴

import java.util.ArrayList;
import java.util.HashMap;

public class Test {

public static void main(String[] args) {
ArrayList<String> strList = new ArrayList<String>();
HashMap<String, String>  strMap = new HashMap<String, String>();
strMap.put("1", "tt1");
strMap.put("2", "tt2");
strMap.put("3", "tt3");
strMap.put("4", "tt4");
strList.add("1");
strList.add("2");
strList.add("3");
strList.add("4");
//两个比较哪个快 TODO
if(strMap.containsKey("4")){
System.out.println("HashMap-->"+strMap.get("4"));
}
for (String string : strList) {
if(string.equals("4")){
System.out.println("ArrayList-->"+string);
}
}

}
}



lz的java是半路出家的,希望大家告诉我结果,当然告诉原因最好
明天结贴给分

------解决方案--------------------
HashMap-->tt4
ArrayList-->4

这里面没有任何的算法,也没有什么特别的地方,只有基本的程序语句结构,所以原因就真的没有什么好说的了。
------解决方案--------------------
引用:
HashMap-->tt4
ArrayList-->4

这里面没有任何的算法,也没有什么特别的地方,只有基本的程序语句结构,所以原因就真的没有什么好说的了。


嗯,靠谱+10086...数据存放结构的问题,你可以去看看这集合的特性,是单链表还是双链表,还是树形结构...
------解决方案--------------------
我的思路是搞10w个循环,然后获取,对比下时间就可以了。。
------解决方案--------------------
这个啷个使用场景看你需求,效率上ArrayList要快。但是如果后续要快熟获取集合中的某一项这是Map就方便快捷,效率肯定比循环查找好快很多。
------解决方案--------------------
结果就不说了。很简单。

说说效率的,Java最基本的数据结构有数组和链表。
数组的特点是空间连续(大小固定)、寻址迅速,但是插入和删除时需要移动元素,所以查询快,增加删除慢。这里ArrayList就属于这类。

链表恰好相反,可动态增加或减少空间以适应新增和删除元素,但查找时只能顺着一个个节点查找,所以增加删除快,查找慢。

有没有一种结构综合了数组和链表的优点呢?当然有,那就是哈希表(虽说是综合优点,但实际上查找肯定没有数组快,插入删除没有链表快,一种折中的方式吧)。Hashmap就属于这类。

所以查询肯定是ArrayList快。
------解决方案--------------------
查询显示打印,ArrayList快!
------解决方案--------------------
ArrayList内部维护了一个数组,得到数组中的一个数据,用下标可以直接得到,很快,但是插入,删除的时候会牵扯到数组中其他数据的位移,后移(插入时)或者前补(删除时),hashMap用的是键值对,内部使用了hash算法,得到一个数据时不需要遍历集合,根据key使用hash函数计算得到数据所在位置,进而取得数据,因为这种特性map一般用于作为缓存使用,如果数据量比较大的话,我的想法是使用hashmap,他比较快。
------解决方案--------------------
那就自己研究源码,看jdk内部是如何实现的
------解决方案--------------------
论效率,hashmap稍微快一点,因为hashmap对遍历做了一些优化,先通过散列值快速定位,然后在遍历的。
------解决方案--------------------
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < 1000000; i++) {
list.add(String.valueOf(i));
}

long startList = System.nanoTime();
for (String string : list) {
if (string.equals("100000")) {
System.out.print("ArrayList-->");
long endList= System.nanoTime();
System.out.println("程序运行时间: "+(endList-startList)+"ms");
}
}

Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < 1000000; i++) {
map.put(String.valueOf(i), String.valueOf(i));
}

long startMap = System.currentTimeMillis();
if (map.containsKey("100000")) {
System.out.print("Map-->");
long endMap= System.nanoTime();
System.out.println("程序运行时间: "+(endMap-startMap)+"ms");
}
}

------解决方案--------------------
没必要关注这样的效率问题。
其实压根都不是问题。