zoukankan      html  css  js  c++  java
  • Java的容器类小结

    Java的容器类其实就是集合类,只是为了不与Collection接口混淆,国内基本翻译为容器类。

    容器类分为两种:独立元素序列的Collection和键值对的Map.

    Collection主要有如下几种:

    1. List:按插入顺序保存元素;
      • ArrayList:擅长于随机访问元素,但是在List的中间插入和移除元素较慢;
      • LinkedList:插入删除代价较低,特性集比ArrayList大,但随机访问相对比较慢;
    2. Set:不重复保存元素;
      • HashSet:提供最快查找,使用了散列函数,顺序是杂乱的;
      • TreeSet:按照比较结果的升序保存对象,保留了HashSet的查询速度;
      • LinkedHashSet:按照被添加的顺序保存对象,使用了散列函数,同时保留了HashSet的查询速度;
    3. Queue:按排队规则顺序保存元素;

    Map:一组成对的“键值对”对象,允许键来查找值,有如下几种:

    • HashMap:提供最快的查找,没有明显顺序保存对象;
    • TreeMap:按照比较结果的升序保存键,保留了HashMap的查询速度;
    • LinkedHashMap:按照插入的顺序保存键,保留了HashMap的查询速度;

    示例

    package net.oseye;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;
    
    public class RunMain {
    
    	public static void main(String[] args) {
    		int total=1000000;
    		
    		List<Integer> arrayList=new ArrayList<Integer>();
    		List<Integer> linkedList=new LinkedList<Integer>();
    		long start=System.currentTimeMillis();
    		for(int i=0;i<total;i++){
    			arrayList.add(i);
    		}
    		long end=System.currentTimeMillis();
    		System.out.println("ArrayList插入数据时间:"+(end-start));
    		
    		start=System.currentTimeMillis();
    		for(int i=0;i<total;i++){
    			linkedList.add(i);
    		}
    		end=System.currentTimeMillis();
    		System.out.println("LinkedList插入数据时间:"+(end-start));
    		
    		
    		start=System.currentTimeMillis();
    		Iterator<Integer> itArrayList=arrayList.iterator();
    		while(itArrayList.hasNext()){
    			itArrayList.next();
    		}
    		end=System.currentTimeMillis();
    		System.out.println("ArrayList顺序访问时间:"+(end-start));
    		
    		start=System.currentTimeMillis();
    		Iterator<Integer> itLinkedList=linkedList.iterator();
    		while(itLinkedList.hasNext()){
    			itLinkedList.next();
    		}
    		end=System.currentTimeMillis();
    		System.out.println("LinkedList顺序访问时间:"+(end-start));
    		
    		start=System.currentTimeMillis();
    		for(int i=0;i<total;i++){
    			arrayList.get(i);
    		}
    		end=System.currentTimeMillis();
    		System.out.println("ArrayList随机访问时间:"+(end-start));
    		
    		start=System.currentTimeMillis();
    		for(int i=0;i<total;i++){
    			linkedList.get(i);
    		}
    		end=System.currentTimeMillis();
    		System.out.println("LinkedList随机访问时间:"+(end-start));
    	}
    }

    输出

    ArrayList插入数据时间:219
    LinkedList插入数据时间:266
    ArrayList顺序访问时间:15
    LinkedList顺序访问时间:16
    ArrayList随机访问时间:16

    输出结果少了一条“随机访问时间”,因为实在太慢了,我等了20+分钟一直没出现结果,就先放弃了。

    而插入时间ArraryList反而快,估计是因为都是在尾部添加所致,如果随机插入就可以看出结果了:

    package net.oseye;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.List;
    
    public class RunMain {
    
    	public static void main(String[] args) {
    		int total=100000;
    		
    		List<Integer> arrayList=new ArrayList<Integer>();
    		List<Integer> linkedList=new LinkedList<Integer>();
    		
    		for(int i=0;i<1000;i++){
    			arrayList.add(i);
    		}
    		for(int i=0;i<1000;i++){
    			linkedList.add(i);
    		}
    		
    		
    		long start=System.currentTimeMillis();
    		for(int i=0;i<total;i++){
    			arrayList.add(800,i);
    		}
    		long end=System.currentTimeMillis();
    		System.out.println("ArrayList插入数据时间:"+(end-start));
    		
    		start=System.currentTimeMillis();
    		for(int i=0;i<total;i++){
    			linkedList.add(800,i);
    		}
    		end=System.currentTimeMillis();
    		System.out.println("LinkedList插入数据时间:"+(end-start));
    	}
    }

    输出

    ArrayList插入数据时间:3391
    LinkedList插入数据时间:203

    PS:我这里一直存在一个疑问:我使用迭代器遍历,是否就是传说中的顺序访问呢?(待解决)

    出处:http://www.zhaiqianfeng.com    
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    019_linuxC++之_函数模板引入
    018_linuxC++之_抽象类的引入
    017_linuxC++之_多态的引入
    《将博客搬至CSDN》
    016_linuxC++之_多重继承
    013_linuxC++之_派生类中权限的调整
    015_linuxC++之_覆写
    014_linuxC++之_不同类型的继承
    012_linuxC++之_类的继承定义
    011_linuxC++之_继承的引入
  • 原文地址:https://www.cnblogs.com/zhaiqianfeng/p/4620124.html
Copyright © 2011-2022 走看看