Java集合总结

collection

├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set

Map
├Hashtable
├HashMap
└WeakHashMap

HashMap与HashTable有什么区别:(数组+链表)
1、HashMap是非线程安全的,HashTable是线程安全的。

2、HashMap的键和值都允许有null值存在,而HashTable则不行。

3、因为线程安全的问题,HashMap效率比HashTable的要高。

HashTable和ConcurrentHashMap的比较
ConcurrentHashMap是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。同样是线程安全的类,它与HashTable在同步方面有什么不同呢?

之前我们说,synchronized关键字加锁的原理,其实是对对象加锁,不论你是在方法前加synchronized还是语句块前加,锁住的都是对象整体,但是ConcurrentHashMap的同步机制和这个不同,它不是加synchronized关键字,而是基于lock操作的,这样的目的是保证同步的时候,锁住的不是整个对象。

ConcurrentHashMap基于concurrentLevel划分出了多个Segment来对key-value进行存储,从而避免每次锁定整个数组,在默认的情况下,允许16个线程并发无阻塞的操作集合对象,尽可能地减少并发时的阻塞现象。允许多个修改操作并发进行,其关键在于使用了锁分离技术。

在多线程的环境中,相对于HashTable,ConcurrentHashMap会带来很大的性能提升
ConcurrentHashMap源码解析
http://www.iteye.com/topic/344876
当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。Hashtable的使用不被推荐,因为HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以转换为同步的。

LinkedHashMap和HashMap的区别
LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

HashMap按值排序

public class Test {  

    public static void main(String[] args) {  
        //统计每个数字出现的个数
        int data[] = { 2, 5, 2, 3, 5, 2, 3, 5, 2, 3, 5, 2, 3, 5, 2,  
                7, 8, 8, 7, 8, 7, 9, 0 };  
       Map<Integer, Integer> map = new HashMap<Integer, Integer>();  
        for (int i : data) {  
            if (map.containsKey(i)) {//判断HashMap里是否存在  
                map.put(i, map.get(i) + 1);//已存在,值+1  
            } else {  
                map.put(i, 1);//不存在,新增  
            }  
        }  
        //map按值排序  (按map中的值降序排序)
        List<Map.Entry<Integer, Integer>> list = new ArrayList<Map.Entry<Integer, Integer>>(  
                map.entrySet());  
        Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {  
            public int compare(Map.Entry<Integer, Integer> o1,  
                   Map.Entry<Integer, Integer> o2) {  
                return (o2.getValue() - o1.getValue());  
            }  
        });  
        for (Map.Entry<Integer, Integer> m : list) {  
            System.out.println(m.getKey() + "-" + m.getValue());  
        }  
    }  

} 

具体源码分析
http://blog.csdn.net/zhangerqing/article/details/8193118

ArrayList、LinkedList、Vector的区别
Arraylist和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以插入数据慢,查找有下标,所以查询数据快,Vector由于使用了synchronized方法-线程安全,所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项前后项即可,插入数据较快。
具体详细可参照
https://www.cnblogs.com/yw-ah/p/5841327.html

什么场景下更适宜使用LinkedList,而不用ArrayList

我前面已经提到,很多场景下ArrayList更受欢迎,但是还有些情况下LinkedList更为合适。譬如:

1) 你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。

2) 你的应用更多的插入和删除元素,更少的读取数据。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值