HashMap、HashSet、TreeMap、TreeSet、LinkedHashMap的数据结构以及适用场景

HashMap:

                 数组+链表+红黑树实现。通过hashcode映射方式,能更快的查询。一般用于对健值对方式快速查询的使用场景。但是线程不安全,线程的安全的话可以使用tableMap,但tableMap的锁太重,因此可以使用ConcurretHashMap采取分段锁的方式性能更搞。 HashMap无序,如果要有序遍历的情况可以使用treeMap。

ConcurretHashMap:

            因为HashMap的线程不安全和tableMap的性能不佳,因此采用ConcurretHashMap在用于性能安全场景更合适。

ConcurretHashMap采用的是CAS+synchronize的加锁方式。即分段锁(每个锁只锁住数组的对象,而不是整个数组或整个hashmap)。

HashSet: 

       HashSet是哈希表的结构但是无序的且不是健值对的形式,其底层还是用HashMap实现的,因为HashMap的key就是不允许重复的,因此hashset的存入的value作为hashmap的key,而value都是一个final的object对象。其实也就限制了hashmap的map能力。

在需要数据不能重复的使用场景用hashset适用不过了。

TreeMap :

    TreeMap也是可以健值对形式,底层是红黑树的结构,这样可以保持他的有序。在需要有序的map场景再适用不过了。

TreeSet:

     底层是用TreeMap实现的树的结构了。跟HashSet类似,也是限制了TreeMap的map能力,而继承tree能力,将value作为TreeMap的key来保证值的不重复能力。在需要排序,且值不能重复的场景比较适合

 

LinkedHashMap:
    LinkedHashMap相对于HashMap,增加了双链表的结果(即节点中增加了前后指针),其他处理逻辑与HashMap一致,同样也没有锁保护,多线程使用存在风险。LinkedHashMap保证了可以数据按照访问顺序或插入顺序来操作。如android中LruCache就是运用了这个的LRU(近期最少使用算法),固定大小的LinkedHashMap,当超过阈值的时候就进行LRU进行删除,以达到缓存的策略。DiskLruCache也是跟Lrucache类同,只不过是LruCache内存存储的缓存策略,而DiskLruCache是在磁盘或外部存储上的存储缓存策略。

你可能感兴趣的:(java,数据结构)