深圳企业做网站,wordpress 获取相关文章,创意网站建设策划方案,故宫上海网络营销公司一、ArrayList
1、概述
ArrayList是实现了List接口的动态数组#xff0c;所谓动态数组就是他的大小是可变的。实现了所有可选列表操作#xff0c;并允许包括Null在内的所有元素。除了实现 List 接口外#xff0c;此类还提供一些方法来操作内部用来存储列表的数组的大小。 …一、ArrayList
1、概述
ArrayList是实现了List接口的动态数组所谓动态数组就是他的大小是可变的。实现了所有可选列表操作并允许包括Null在内的所有元素。除了实现 List 接口外此类还提供一些方法来操作内部用来存储列表的数组的大小。
每个ArrayList实例都有一个容量该容量是指用来存储列表元素的数组的大小。默认初始容量是10。默认初始容量为10。随着ArrayList中元素的增加它的容量也会不断的自动增长。在每次添加元素时ArrayList都会检查是否需要进行扩容操作扩容操作带来数据向新数组的重新拷贝所以如果我们知道具体业务数据量在构造ArrayList时可以给ArrayList 指定一个初始容量这样就会减少扩容时的拷贝问题。当然在添加大量元素前应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量这可以减少递增式再分配的数量。
ArrayList基本参数
grow() 扩容方法
扩容规则
new ArrayList()的初始容量是0new ArrayList(int initialCapacity),会使用指定容量的数组new ArrayList(Collection c),则会使用这个集合c的大小作为容量add(Object o)一个一个添加元素 当第一次add时会首次扩容到10然后把元素加到传递为10的数值中当元素个数大于10时会进行继续扩容后面每一次扩容后的容量都会是原来数组的1.5倍使用的计算方式是原来的长度右移一位得到原来的一半再加上原来的长度 ( 10 1 10 ) 15 (101 10)15 (10110)15前10次扩容[0101522334973109163224] addAll(Collection c)添加集合元素 当使用addAll添加集合元素会对下次扩容的容量和实际的元素个数之间选一个较大的数作为扩容后的容量
迭代器IteratorFailFast VS failSafe
FailFast 非哦发斯当进行遍历时不允许其他线程对集合来进行修改会直接抛出异常FailSafe非哦谁斯当进行遍历时运行运行其他线程对集合进行修改只不过会牺牲部分一致性 ArrayList使用的就是FailFast 策略执行遍历的 ArrayList再执行迭代时迭代器对象会先记录集合的修改次数然后去执行迭代方法next()然后再执行next()迭代方法时会先对比较迭代前的集合的修改次数和现在的修改次数是否相同如果相同则继续执行迭代当不相同时表示集合在迭代时被修改过则会抛出异常 CopyOnWriteArrayList 科批安外使用的则是FailSafe策略执行遍历再遍历时允许其他线程进行修改 CopyOnWriteArrayList 再执行迭代时使用的是读写分离的方式在执行add方法添加元素时不是直接添加在原来的数组里而是在把原来的数组复制了一个新的数组且长度在原来的基础上1添加的这个元素就放在了复制的数值扩容的那一个位置中所以压根不会影响到迭代器遍历只不过是牺牲了一致性迭代时读取不到这个新添加的元素而已。
ArrayList和LinkedList的区别 ArrayList 基于数组需要连续内存随机访问快指根据下标访问因为ArrayList的数据结构是数组在内存中存储是连续的随机访问时就可以根据下标通过简单的运算得到想要寻找的元素。ArrayList也通过继承了RandomAccess接口作为标识让jdk在执行时会采用下标的方式去寻找。而LinkedList则没继承尾部插入、删除性能可以其他部分插入、删除都会移动数据因此性能会比较低可以利用cpu缓存局部性原理因为ArrayList基于数组所以在内存中存储是连续的就可以很好的利用cpu缓存 因为cpu缓存是具有局部性原理的cpu每次在读取内存的数据时会把它缓存在cpu缓存中这样就可以避免每次都直接到内存中去读取数据可以有效的提高效率而cpu的局部性原理则是它每次到内存读取数据时会顺带把你需要读取的数据的周边的数据也一并读到缓存中。因为cpu会觉得你有很大的概率会读取周边的数据。而数组刚好内存存储就是连续的所以就可以有效的利用到这一点减少直接到内存中去读取的次数。而LinkedList则没法很好的利用这一点因为它在内存中数据存储不是连续的所以在读取时没法有效的把接近的数据存储到CPU缓存中。 LinkedList 基于链表内存存储不是连续的随机访问较慢因为内存存储不是连续的没法通过下标计算找到想要寻找的元素所以在查找时需要通过链表一个一个去遍历才能找到需要寻找的元素头尾插入删除性能较高而中间位置的插入删除非常慢因为插入需要先执行查询找到指定的位置然后再去执行添加而LinkedList执行查询的效率非常的慢综合下来再中间部分执行插入时效率反而会比ArrayList慢很多占用内存比较多因为LinkedList是由一个一个的Node对象组成每个Node对象中又存储了头节点和尾节点和数据所以先对于ArrayList的内存占用会高很多