更多信息,请参考: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("***********************************************************"); } }
运行结果:
放入顺序为: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排序 } });
常用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); }
entrySet比keySet 效率要高很多。
keySetMap.keySet()会生成KeyIterator迭代器,其next方法只返回其key值
entrySetMap.entrySet()方法会生成EntryIterator 迭代器,其next方法返回一个Entry对象的一个实例,其中包含key和value
方式一再取得key所对应的value时,此时还要访问Map的这个方法,这时,方式一多遍历了一次table。
更多信息,请参考:http://www.cxyeye.com/