美文网首页
collection

collection

作者: 懒得阳光 | 来源:发表于2017-08-10 15:11 被阅读0次
    架构图


    HashMap:线程不安全。底层jdk1.7之前是初始是16的entry数组,二叉树链表(解决hash冲突)。jdk1.8之后是node,红黑树(当节点数大于8时)https://my.oschina.net/hosee/blog/618953

    key值对象

    @Override

    public boolean equals(Object obj) {

    return this.id == ((MyClass) obj).id;

    }

    /**重写hashcode可以

    @Override

    public int hashCode() {

    return id;

    }

    ***/

    红黑树:http://www.jianshu.com/p/23b84ba9a498

    为什么初始是16

    很多位运算保证了初始容量一定为2的幂

    HashMap中的数据结构是数组+单链表的组合,希望是元素存放的更均匀,最理想的效果是,Entry数组中每个位置都只有一个元素,这样,查询的时候效率最高,不需要遍历单链表,也不需要通过equals去比较K,而且空间利用率最大

    HashTable:线程安全(synchronization)。

    LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一点;而在迭代访问时反而更快,因为它使用链表维护内部次序。

    TreeMap:基于红黑树的实现。查看“键”或“键值树”时,它们会被排序(次序由Comparable或Comparator决定)。TreeMap的特点在于,所得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。

    ConcurrentHashMap (架构图上和hashmap并列 继承AbstractMap):1.7:锁分段技术,由多个Segment组成(Segment下包含很多Node,也就是键值对),每个Segment都有把锁来实现线程安全,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。1.8的实现已经抛弃了Segment分段锁机制,利用CAS+Synchronized来保证并发更新的安全,底层依然采用数组+链表+红黑树的存储结构。内存占用率和hashmap差不多,get方法不会加锁,所以速度不会慢,put方法支持并发,有加锁操作,速度多少会比hashmap慢一点。可以并发更新http://blog.csdn.net/u010412719/article/details/52145145            http://www.jianshu.com/p/c0642afe03e0

    arraylist:底层为数组,查询快,有顺序,可重复collections.synchronizedxxx是全部加了同步

    linkedList:双向链表,修改快。

    vector:同步synchronized

    hashset:不可重复,无顺序。

    treetSet:Integer能排序(有默认顺序), String能排序(有默认顺序), 自定义的类存储的时候出现异常(没有顺序),如果想把自定义类的对象存入TreeSet进行排序, 那么必须实现Comparable接口,不同步

    相关文章

      网友评论

          本文标题:collection

          本文链接:https://www.haomeiwen.com/subject/rncqrxtx.html