zoukankan      html  css  js  c++  java
  • java常用集合框架底层实现简介与注意点

    Collection:

    ArrayList:
    1:底层实现是数组,默认长度是10.
    2:add(),判断是否数组越界,是数组扩容为原来的两倍。
    3:remove(),copy数组,size-1,释放空虚的空间。

    HashSet:
    底层实现是一个HashMap,把值存在map的key上,value存的是一个object对象,就是说底层的HashMap中value都是一样的。
    HashSet是无序的,不允许重复。

    LinkedHashSet:
    基础自HashSet,底层实现是一个LinkedHashMap,通过equals()方法比较两个对象是否相等,初始容量16,加载因子0.75f.
    使用链表维护数据的顺序,所有说是有序,不重复的,对象都是存在底层map的key上,所有允许有且只有一个对象为null。

    LinkedList:
    1.LinkedList基于链表实现
    2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
    3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
    4.查找操作indexOf,lastIndexOf,contains等,两者差不多。

    Map:


    HashMap:
    初始容量值:16,加载因子0.75f.
    put()第一个对象的时候,进行初始化,容量16,极限值12,大于极限就要进行扩容。
    其底层是一个Entry数组,根据hash值,算法决定object val 对象存在Entry数组的位置。
    注意点在用Iterator进行遍历map的时候,在遍历过程中不能调用remove()方法,否则会报错。
    java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:922)
    at java.util.HashMap$EntryIterator.next(HashMap.java:962)
    at java.util.HashMap$EntryIterator.next(HashMap.java:960)

    原因:
    在获得hashmap的迭代器的时候,构造器中会把expectedModCount = modCount;modCount:(记录map增加,删除,modCount+1)
    在迭代过程中如何调用remove() or add()方法,modCont+1,在iterator.next()的时候会去比较expectedModCount与modCont是否相等,不等,报错。

    源码:

    LinkedHashMap:
    初始容量16,加载因子0.75f.
    一个有序的map。继承HashMap,LinkedHashMap并未重写父类HashMap的put方法,而是重写了父类HashMap的put方法调用的子方法void addEntry(int hash, K key, V value, int bucketIndex) 和void createEntry(int hash, K key, V value, int bucketIndex),提供了自己特有的双向链接列表的实现。

  • 相关阅读:
    UICollectionView 应用
    关于UIWebView不能响应touchesBegan等四个方法的解决案例【可以检测 单击双击】
    IOS6 中新特性介绍
    KVO 使用
    IOS 学习资料汇总(^_^)
    [DEVDIV翻译] Core Animation中文翻译_第一章_什么是核心动画
    StoryBoard学习..(很详细.)
    Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
    sqlite语句主页
    Android的快速开发框架 afinal
  • 原文地址:https://www.cnblogs.com/tom-plus/p/6021537.html
Copyright © 2011-2022 走看看