java集合之ArrayList

2019 精帖
1 197

        ArrayList的实现是一个动态数组,从源码中也可以看出。这就决定了他的查找效率高,可以直接通过下标访问。但是对于删除和增加元素,需要大量的移动元素,所以插入和删除的效率就很低。


a1.png


ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类。

 

构造方法:

ArrayList(int initialCapacity) 构造具有指定初始容量的空列表

ArrayList() 默认容量是10

ArrayList(Collection<? extends E> c)  构造包含指定集合的元素的列表,按集合的迭代器返回元素的顺序排列


重点看看添加方法是如何扩容的

a2.png

    跟随方法的调用发现了扩容的时机:

    如果添加元素以后的容量大于当前数组的长度了,则会执行扩容方法

a3.png


扩容方法:

a4.png


int newCapacity = oldCapacity + (oldCapacity >> 1);

已经很明确的告诉我们数组扩容后的容量是原数组的1.5倍。右移一位就相当于除以2,再加上原来数组的长度。即为原来的1.5倍

接着Arrays.copyOf(elementData, newCapacity);方法追踪下去会发现,底层调用的是System类的arraycopy(Object src, int srcPos, Object dest, int destPos, int length)方法。这也说明了ArrayList的扩容是浅拷贝。


浅拷贝和深拷贝

浅拷贝说白了就是把数组的引用拷贝一份。拷贝的数组元素,和被拷贝的数组元素还是指向同一个对象。

a6.png

深拷贝和浅拷贝的区别是深拷贝连同数据一块复制了一份,两个数组之间没有关系

a8.png



移除方法

a9.png


第一步是先检查范围。

源码中可以看出System.arraycopy(elementData, index+1, elementData, index,  numMoved);就是在移动元素,然后将最后一个元素空出来置为null



留言(0)
加载更多
猜你喜欢
  • blog springbooy整thymeleaf

    在springboot整视图层,官方推荐使用thymeleaf。 thymeleaf只是渲染html的一种方式,是一种模板。第一步创建一个maven项目 第二步:修改Jdk版本,添加thymeleaf启动器 <properti
  • blog 线程间的通讯

    1.什么是线程通信 线程间通信的两个基本问题是互斥和同步。 线程同步是指线程间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。2.syn
  • blog 递归实现并两递增链表-并后保持递增序列

    递归实现并两递增链表-并后保持递增序列java描述数据结构:单链表算法:递归链表节点package club.test;/*** * 链表节点 * @author jiajia * */public class Node { publi
  • blog springmvc成websocket

    springmvc成websocket环境:spring+springmvc+tomcat8注意:本测试项目 运行环境不能低于tomcat81.websocket配置package club.jiajiajia.connom.servic
  • blog springboot整mybatis

    springboot整mybatis1.创建maven项目2.sql文件SET NAMES utf8mb4;SET FOREIGN_KEY_CHECKS = 0;-- ------------------------------ Tabl
  • blog equals()与hashCode()方法总结

    1.hashCode方法的作用: 对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode,hashCode方法的主要作用是为了配基于散列的一起正常运行,这样的散列包括HashSet、HashMap以及H
  • blog java短信验证码接口(阿里云/聚数据)

    阿里云pom文件 <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId>
  • blog jvm内存模型分析-垃圾收器和内存分配策略(1)

    jvm内存模型分析-垃圾收器和内存分配策略(1)         说起垃圾收( Garbagc Collcction,GC),大部分人都把这项技术当做java语言的伴生产物。事实上,GC的历史比
  • blog 并发编程-java线程内存模型(JMM)和volatile关键字理解

    硬件的效率与一致性         在正式讲解Java虚拟机并发相关的知识前,我们先花费一点时间去了解一下物理计算机中的并发问题,物理机遇到的并发问题与虚拟机中的情况有不少相似处,物理机对并发的
  • file java项目-数据库间定时进行数据交换服务(数据同步)

    <h3 style="text-align: center;">java项目-数据库间定时进行数据交换服务(右上方下载)</h3> <p>压缩包内附sql脚本,本项目为springboot+myba