java中map小结

      map是java中常用到的一种集合类。自编码以来,接触到的map有Hashmap,LinkedHashMap,Hashtable,ConcurrentHashMap,TreeMap,小结一下他们的区别和使用的场景。

       用的最多的,是hashmap。这是个线程不安全的map,即他不能被多线程同时访问。当然只是get方法的话没问题,但最好不要在多线程的时候用它。。。 当然,单线程情况下,他是最好用的map,因为他的时间复杂度是O(1),常数级别的插数和取数操作。

      LindedHashMap跟HashMap很像,我记得我用过两次,是在想用hashmap且想保留插入顺序的时候用的。他跟hashmap的不同就是他保留了插入的顺序,以便以后遍历的时候用到。不过遍历map的情况不多,所以LinkedHashMap的受欢迎程度跟HashMap是不可同日而语的。

       HashTable是线程安全的,不过现在差不多被摒弃了。。现在用的都是ConcurrentHashMap,jdk1.5之后新加入的map,多线程方面体验更高效。关于这个以后的学习中肯定要深入学习。

      TreeMap我没用过,不过上次面试被面试官问道了,我知道TreeMap是基于key排序的,实现了SortMap接口,内部是红黑树实现的。就是说你插入的key,他自动给你排好顺序了。。    只是到这了,然后顺便被面试官鄙视了一下红黑树。。。  因为我实在是个菜鸟,那时候对红黑树一窍不通,红黑树的学习也会在博客里面更新,作为自己的一个学习笔记。值得一提的是,Treemap也可以实现自定义的排序,参考Collections.sort(http://709002341.iteye.com/admin/blogs/2256274)。

      Map的遍历也有多种方法,一一列举(以HashMap为例):

     只遍历key:

     

Map<String,String> m = new HashMap<String,String>();
		for(String key:m.keySet()){
			
		}

       也可以这样:

   

Iterator<String> keyIt = m.keySet().iterator();
		while(keyIt.hasNext()){
			String key = keyIt.next();
		}

       当然,取到key就可以拿到value了。

       如果你只需要遍历value,那么以下两种方式比较适合:

       

for(String value:m.values()){
			
		}
Iterator<String> it = m.values().iterator();
		while(it.hasNext()){
			
		}

     这两种方式只是把全部的values取出来,不涉及到key值,空间和性能都是最优的。

       当然,也可以无脑得先遍历key,然后用key取value,这种方式是最慢的。   因为涉及到一个value的查找问题,而且还有额外的key的空间消耗。。。 我刚学java的时候就这么干过,被婶婶的鄙视了。。。 

        另外就是如果需要遍历key和value,建议用这两种方式:

for(Entry<String,String> e:m.entrySet()){
			String key = e.getKey();
			String value = e.getValue();
		}
Iterator<Entry<String,String>> i = m.entrySet().iterator();
		while(i.hasNext()){
			Entry<String,String> e = i.next();
			String key = e.getKey();
			String value = e.getValue();
		}

 这两种方式都是直接将key和value取出来,不涉及到通过key查value的过程。虽说通过key查value很快,不过再快也是需要点时间消耗的,能省就省吧!

    

猜你喜欢

转载自709002341.iteye.com/blog/2256754