程序员之👀

导航

Java常用容器类学习总结

Posted on 2012-08-05 18:15  ^阿福^  阅读(7504)  评论(0编辑  收藏  举报

 更多信息,请参考:http://www.cxyeye.com/

  Java类中的常用容器有HashMap,HashTable,ArrayList,TreeMap,LinkHashMap等,实际应用中应该如何选择与使用,应该注意哪些东西?这里把工作中遇到的一些问题进行总结,以便以后碰到相同问题能更快解决。

 

容器的出入排序及大小排序

说明:此处的排序 是指:

1: 往集合中插入元素的顺序与遍历元素的顺序的关系;

2: 往对象中插入元素后,遍历的时候否会根据元素的大小排序(字符串、数字大小等)

 

public class MapSortTest {

    public static void main(String[] args) {
        
        System.out.println("放入顺序为:a:aaa c:ccc b:bbb d:ddd ");
        System.out.println("HashMap 排序测试");
        Map map = new HashMap(); 
        map.put("a", "aaa");  
        map.put("c", "ccc");
        map.put("b", "bbb"); 
        map.put("d", "ddd"); 
        Iterator iterator = map.keySet().iterator(); 
        while (iterator.hasNext()) { 
            Object key = iterator.next(); 
            System.out.println("key:"+key+"         value:" + map.get(key)); 
        } 
        System.out.println("HashMap 进出无次序 ; key大小无次序 ");
        System.out.println("***********************************************************");
        
        
        System.out.println("Hashtable 排序测试");        
        Hashtable tab = new Hashtable(); 
        tab.put("a", "aaa"); 
        tab.put("c", "ccc");
        tab.put("b", "bbb");  
        tab.put("d", "ddd"); 
        Iterator iterator_1 = tab.keySet().iterator(); 
        while (iterator_1.hasNext()) { 
            Object key = iterator_1.next(); 
            System.out.println("key :"+key+"             value:"+ tab.get(key)); 
        } 
        System.out.println("Hashtable 进出无次序 ; key大小无次序 ");
        System.out.println("***********************************************************");
        
        System.out.println("TreeMap 排序测试");                
        TreeMap tmp = new TreeMap(); 
        tmp.put("a", "aaa"); 
        tmp.put("c", "ccc"); 
        tmp.put("b", "bbb"); 
        tmp.put("d", "ddd"); 
        Iterator iterator_2 = tmp.keySet().iterator(); 
        while (iterator_2.hasNext()) { 
            Object key = iterator_2.next(); 
            System.out.println("key:"+key+"          value:" + tmp.get(key)); 
        } 
        System.out.println("TreeMap 进出无次序 ; key大小从小到大 ");
        System.out.println("***********************************************************");
        
        System.out.println("LinkedHashMap 排序测试");                
        LinkedHashMap linkedHashMap = new LinkedHashMap(); 
        linkedHashMap.put("a", "aaa"); 
        linkedHashMap.put("c", "ccc"); 
        linkedHashMap.put("b", "bbb"); 
        linkedHashMap.put("d", "ddd"); 
        Iterator iterator2 = linkedHashMap.keySet().iterator(); 
        while (iterator2.hasNext()) { 
            Object key = iterator2.next(); 
            System.out.println("key:"+key+"          value:" + linkedHashMap.get(key)); 
        }         
        System.out.println("LinkedHashMap 先进先出; key大小无次序 ");
        System.out.println();
        
        System.out.println("ArrayList 排序测试");
        System.out.println("放入顺序为:aaa ccc bbb ddd");
        ArrayList arrayList=new ArrayList(); 
        arrayList.add("aaa"); 
        arrayList.add("ccc"); 
        arrayList.add("bbb"); 
        arrayList.add("ddd"); 
        System.out.println("ArrayList 先进先出;值大小无次序 ");
//        Collections.sort(arrayList); 
        for(int i=0;i<arrayList.size();i++){ 
            System.out.println(arrayList.get(i)); 
        } 
        System.out.println("***********************************************************");
    }

}
View Code

 

运行结果:

放入顺序为:a:aaa c:ccc b:bbb d:ddd 
HashMap 排序测试
key:d         value:ddd
key:b         value:bbb
key:c         value:ccc
key:a         value:aaa
HashMap 进出无次序 ; key大小无次序 
***********************************************************
Hashtable 排序测试
key :b             value:bbb
key :a             value:aaa
key :d             value:ddd
key :c             value:ccc
Hashtable 进出无次序 ; key大小无次序 
***********************************************************
TreeMap 排序测试
key:a          value:aaa
key:b          value:bbb
key:c          value:ccc
key:d          value:ddd
TreeMap 进出无次序 ; key大小从小到大 
***********************************************************
LinkedHashMap 排序测试
key:a          value:aaa
key:c          value:ccc
key:b          value:bbb
key:d          value:ddd
LinkedHashMap 先进先出; key大小无次序 

ArrayList 排序测试
放入顺序为:aaa ccc bbb ddd
LinkedHashMap 先进先出;值大小无次序 
aaa
ccc
bbb
ddd
***********************************************************

 

大批量数据填充到容器中的性能提升

 在使用add()方法增加新的元素时,如果要增加的数据量很大,应该使用ensureCapacity()方法,该方法的作用是预先设置Arraylist的大小,这样可以大大提高初始化速度。

 

使用匿名内部类对对List排序的方法:

List<Map.Entry<String, Integer>> info = new ArrayList<Map.Entry<String, Integer>>(maps.entrySet());
   
Collections.sort(info, new Comparator<Map.Entry<String, Integer>>() {         
    public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2){   
        return obj1.getKey().compareTo(obj2.getKey());//按key排序   
    //return obj2.getValue() - obj1.getValue(); //按value排序   
      }   
}); 
View Code

 

 

常用Map的遍历方法,及方法的不同点  

Map的遍历:

//方法1
Iterator<String> keySetIterator = keySetMap.keySet().iterator();   
while (keySetIterator.hasNext()) {   
    String key = keySetIterator.next();   
    String value = keySetMap.get(key);   
    System.out.println(value);
}  

//方法2
Iterator<Entry<String, String>> entryKeyIterator = entrySetMap.entrySet().iterator();   
while (entryKeyIterator.hasNext()) {   
    Entry<String, String> e = entryKeyIterator.next();   
    String key=e.getKey();
    String value=e.getValue();
    System.out.println(value);
} 
View Code

 

entrySet比keySet 效率要高很多。
 keySetMap.keySet()会生成KeyIterator迭代器,其next方法只返回其key值
 entrySetMap.entrySet()方法会生成EntryIterator 迭代器,其next方法返回一个Entry对象的一个实例,其中包含key和value
 方式一再取得key所对应的value时,此时还要访问Map的这个方法,这时,方式一多遍历了一次table。 

 更多信息,请参考:http://www.cxyeye.com/

 

程序员之👀