爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【JDK源码】ArrayList的代码实现

      首页 知识中心 软件开发 文章详情页

      【JDK源码】ArrayList的代码实现

      2024-03-22 08:15:20 阅读次数:117

      ArrayList,数组,迭代

      基础介绍

      ArrayList 底层数据结构就是一个数组:

      1、index 表示数组下标,从 0 开始计数,elementDatda 表示数组本身

      2、DEFAULT_CAPACITY 表示数组的初始化大小,默认是10

      3、size 表示数组的大小,int 类型,没有使用 volatile 修饰,非线程安全

      4、modCount 统计当前数组被修改的版本次数,数组结构有变动,就会+1

      类注释

      1、允许 put null 值,会自动扩容

      2、size、isEmpty、get、set、add 等方法的时间复杂度都是O(1)

      3、不是线程安全的,多线程情况下,推荐使用线程安全类:Collections#synchronizedList

      4、增强 for 循环,或者使用迭代器迭代过程中,如果数组大小被改变,会快速失败,抛出异常

      源码解析

      1、初始化

      三种方法:无参数直接初始化、指定大小初始化、指定初始数据初始化。

      源码

      private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
      // 保存数组的容器,默认是null
      transient Object[] elementData;
      
      // 无参数直接初始化
      public ArrayList() {
         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
      }
      
      // 指定大小初始化
      public ArrayList(int initialCapacity) {
          if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
          } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
          } else {
            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
          }
      }
      
      // 指定初始化数据初始化
      public ArrayList(Collection<? extends E> c) {
          Object[] a = c.toArray();
          // 如果给定的集合不为空
          if ((size = a.length) != 0) {
            // 传入的集合类型为ArrayList时,数组直接地址指向a,否则拷贝数据
            if (c.getClass() == ArrayList.class) {
              elementData = a;
            } else {
              elementData = Arrays.copyOf(a, size, Object[].class);
            }
          } else {
            // 给定的集合数据为空时,默认空数组
            elementData = EMPTY_ELEMENTDATA;
          }
      }

      从源码中可以得到以下几点:

      1、ArrayList 无参构造器初始化时,默认大小是空数组,数组大小 10 是在第一次 add 的时候扩容的数组值。

      2、指定数据初始化的时候,在传入的数据为空时,依旧会初始化为空数组。当传入的集合类型为ArrayList 时,elementData 会直接使用 toArray 生成的数组。

      2、新增和扩容

      添加元素时进行了两步操作:

      1、判断是否需要扩容

      2、elementData 数组赋值,这里是非线程安全的

      /**
       * Appends the specified element to the end of this list.
       *
       * @param e element to be appended to this list
       * @return <tt>true</tt> (as specified by {@link Collection#add})
       */
      public boolean add(E e) {
        // 判断数组的大小是否还够存放新数据,不够则扩容,size是当前数组存放元素的个数
        ensureCapacityInternal(size + 1);  
        // 数组赋值,线程不安全
        elementData[size++] = e;
        return true;
      }

      扩容(ensureCapacityInternal)的源码

      private void ensureCapacityInternal(int minCapacity) {
          ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
      }
      
      // 计算数组需要的最小容量
      private static int calculateCapacity(Object[] elementData, int minCapacity) {
          // 如果是初始化时未指定大小,则使用默认的大小 10
          if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
          }
          // 否则返回存放当前元素需要的最小容量值
          return minCapacity;
      }
      
      private void ensureExplicitCapacity(int minCapacity) {
          // 数组改变的标志+1
          modCount++;
      
          // 数组需要的最小容量大于数组的长度,数组需要扩容
          if (minCapacity - elementData.length > 0)
            grow(minCapacity);
      }
      
       /**
        * Increases the capacity to ensure that it can hold at least the
        * number of elements specified by the minimum capacity argument.
        *
        * @param minCapacity the desired minimum capacity
        */
      private void grow(int minCapacity) {
          // 记录旧的数组长度
          int oldCapacity = elementData.length;
          // 新的数组长度等于旧的数组长度的 1.5 倍,oldCapacity >> 1相当于除以 2
          int newCapacity = oldCapacity + (oldCapacity >> 1);
          // 新的数组长度小于需要的最小容量时,扩容值修改为最小容量值
          if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
          // 新的数组长度超过最大值时,MAX_ARRAY_SIZE 的值为 Integer 表示的最大值-8
          if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
          // 数组的复制
          elementData = Arrays.copyOf(elementData, newCapacity);
      }
      
      private static int hugeCapacity(int minCapacity) {
          // 内存溢出
          if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
          // 需要的最小容量超过最大值时,返回Integer 表示的最大值
          return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
          MAX_ARRAY_SIZE;
      }

      Java 的源码有一些需要注意的点:

      1、初始化未指定大小的集合,第一次扩容的大小为 10

      2、添加元素时,不管数组有没有扩容,modCount 都会+1

      3、数组容量的最大值是 Integer.MAX_VALUE,超过这个值,JVM 就不会给数组分配内存空间了

      4、新增元素时,没有对值进行严格的校验,所以 ArrayList 可以添加null值。

      源码中值得我们去学习的地方:

      1、代码书写很优雅,一个方法只做一件事,便于理解

      2、要有边界意识,数组的下标最大不超过 Integer 最大值,最小不能小于 0

      3、扩容的本质

      ArrayList 中的数组扩容是通过调用 Arrays 的 copyOf 方法。先创建一个符合我们预期容量的新数组,然后把旧数组的元素拷贝过去。通过调用 System.arraycopy 方法进行拷贝,此方法是 native 修饰的方法

      /**
       * @param src     被拷贝的数组
       * @param srcPos  从数组那里开始
       * @param dest    目标数组
       * @param destPos 从目标数组那个索引位置开始拷贝
       * @param length  拷贝的长度
       * 此方法是没有返回值的,通过 dest 的引用进行传值
       */
      public static native void arraycopy(Object src, int srcPos,
                                          Object dest, int destPos,
                                          int length);

      4、删除

      在源码中关于删除的方法:

      • public boolean remove(Object o):删除第一个匹配的元素
      • public E remove(int index):删除指定位置上的元素,并返回该元素
      • private void fastRemove(int index):私有方法,被remove(Object o)方法调用
      • public boolean removeAll(Collection<?> c):从此列表中删除包含在指定集合中的所有元素。
      • public void clear():清空集合
      /**
       * 移除此列表中指定位置的元素
       */
      public E remove(int index) {
          // 数组越界的检查,index 大于 size 时会抛 IndexOutOfBoundsException 异常
          rangeCheck(index);
      
          modCount++;
          // 当 index 小于 0 时,在这里取值的时会抛出 ArrayIndexOutOfBoundsException 异常 
          E oldValue = elementData(index);
      
          int numMoved = size - index - 1;
          if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
          elementData[--size] = null; // clear to let GC do its work
          return oldValue;
      }
      
      /**
       * 如果指定元素存在,则从此集合中删除第一次出现的指定元素,如果不存在,在保持不变,返回false
       */
      public boolean remove(Object o) {
          // 如果要删除的元素为 null 时
          if (o == null) {
            for (int index = 0; index < size; index++)
              // 判断元素是否为null
              if (elementData[index] == null) {
                fastRemove(index);
                return true;
              }
          } else {
            for (int index = 0; index < size; index++)
              // 使用equals判断元素是否相等
              if (o.equals(elementData[index])) {
                fastRemove(index);
                return true;
              }
          }
          return false;
      }
      
      private void fastRemove(int index) {
          // 记录数组的结构变化
          modCount++;
          // 需要移动的元素个数
          // size 从 1 开始计算,index 从 0 开始,所以需要 -1
          int numMoved = size - index - 1;
          if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
          elementData[--size] = null; // clear to let GC do its work
      }

      从源码可以看出一些注意点:

      1、新增的时候没有对 null 做校验,删除的时候也是可以删除 null 值的

      2、删除所有元素使用的是clear()方法

      3、删除的时候,只做了 index 是否大于 size 的判断,index 为负值时在数组取值时抛出异常。小于 0 和大于 size 时的抛出异常不同。

      4、元素相等的判断在不为 null 的情况下使用 equals 方法,自定义类型元素的删除要注意 equals 的具体实现。

      5、单向迭代器

      实现java.util.Iterator接口类,迭代器中定义的几个参数:

      int cursor;// 迭代过程中,下一个元素的位置,默认从 0 开始。
      int lastRet = -1; // 最后一次迭代时返回的值的索引位置;默认为 -1。
      int expectedModCount = modCount;// expectedModCount 表示迭代过程中,期望的版本号;modCount 表示数组实际的版本号。

      常用的迭代器方法有三个:

      • hasNext 还有没有值可以迭代
      • next如果有值可以迭代,迭代的值是多少
      • remove删除当前迭代的值

      hasNext 源码

      public boolean hasNext() {
          // cursor 表示下一个元素的大小,size 表示实际存放的元素个数,两者相等时,表示没有元素可以便利了
          return cursor != size;
      }

      next源码

      @SuppressWarnings("unchecked")
      public E next() {
          // 检查版本号和预期值是否一致,如果被修改则抛异常
          checkForComodification();
          // 获取应该返回的元素位置
          int i = cursor;
          // 超过元素数量,抛出异常
          if (i >= size)
            throw new NoSuchElementException();
          Object[] elementData = ArrayList.this.elementData;
          if (i >= elementData.length)
            throw new ConcurrentModificationException();
          // 下次迭代时,元素的位置
          cursor = i + 1;
          return (E) elementData[lastRet = i];
      }
      
      // 判断是否修改了 elementData 数组
      final void checkForComodification() {
          if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
      }

      源码这一块里面,next 做了两件事,第一判断能不能继续迭代,第二找到需要迭代的值,并为下次迭代做准备。

      这里面有个很有意思的点,在判断版本号和 i 是否超过元素个数以后,又做了一次是并发修改的判断。新建了一个本地变量,将地址指向 ArrayList 的数组 elementData。此时 elementData 如果修改地址对取值已经没什么影响了。然后判断 i 是否超过数组长度,保证代码正常运行能取值,但是多线程的情况下,取值不一定是对的。

      remove源码

      public void remove() {
          if (lastRet < 0)
            throw new IllegalStateException();
          // 判断数组是否被修改
          checkForComodification();
      
          try {
            ArrayList.this.remove(lastRet);
            cursor = lastRet;
            // -1 表示元素已经被删除,防止重复删除
            lastRet = -1;
            // 删除元素会修改modCount,需要给expectedModCount重新复制
            expectedModCount = modCount;
          } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
          }
      }

      这里有两点需要注意的:

      • lastRet = -1的操作是为了防止重复删除
      • 删除元素成功,数组的 modCount 会改变,需要同步修改 expectedModCount 的值。

      6、双向迭代器

      除了对java.util.Iterator接口类的实现,ArrayList 还有一个双向迭代器的实现,这个类在继承Iterator接口实现类的基础上,实现了java.util.ListIterator接口。因此又增加了几个逆向迭代方法:

      • hasPrevious 前面还有没有值可以迭代,实现代码类似hasNext
      • nextIndex 正向迭代时,下一个迭代的位置
      • previousIndex 逆向迭代时,下一个迭代的位置
      • previous 逆向迭代时,下一个迭代的值,实现类似next
      • set(E e) 修改当前迭代位置上的元素
      • add(E e) 在当前迭代的位置上添加一个元素

      双向迭代器的获取方式,一种是调用listIterator()方法直接获取,默认起始位置是 0 ;另一种是调用listIterator(int index)方法指定迭代器的起始位置

      public int nextIndex() {
          return cursor;
      }
      
      public int previousIndex() {
          return cursor - 1;
      }
      // 修改指定迭代位置上的值
      public void set(E e) {
        if (lastRet < 0)
          throw new IllegalStateException();
        checkForComodification();
      
        try {
          ArrayList.this.set(lastRet, e);
        } catch (IndexOutOfBoundsException ex) {
          throw new ConcurrentModificationException();
        }
      }
      // 在迭代的位置上新增一个值
      public void add(E e) {
        checkForComodification();
        try {
          int i = cursor;
          ArrayList.this.add(i, e);
          cursor = i + 1;
          lastRet = -1;
          expectedModCount = modCount;
        } catch (IndexOutOfBoundsException ex) {
          throw new ConcurrentModificationException();
        }
      }

      7、线程安全

      ArrayList 是线程不安全的,是因为 ArrayList 自身的 elementData、size、modConut 在进行各种操作时,都没有加锁。

      其他问题

      1、为什么引入 modCount 这个变量?

      引入 modCount 变量是为了在遍历集合时,判断是否有并发操作改变数据的标志,在快速失败原理上有使用。

      2、为什么在添加数据时扩容10,而不是初始化的时候?

      节约空间,有时候初始化之后就赋值成别的 list 了

      3、elementData 为什么使用 transient 修饰?

      因为elementData里面不是所有的元素都有数据,因为容量的问题,elementData里面有一些元素是空的,这种是没有必要序列化的。ArrayList的序列化和反序列化依赖writeObject和readObject方法来实现。可以避免序列化空的元素。

      4、new ArrayList(0) 和 new ArrayList(1)的实现

      new ArrayList() 在添加第一个元素时会初始化为 10 个空间,new ArrayList(0)在扩容的时候,执行代码newCapacity = oldCapacity + (oldCapacity >> 1),得到的新数组容量也是 0 ,这时候就会根据实际元素的个数扩容 newCapacity = size + 1。new ArrayList(0)在添加第一个元素后的容量为 1 。

      同样的道理,new ArrayList(1)在添加 2 个元素时,扩容的新容量为 1,不满足最低的容量需求,这时候按照最低的容量要求扩容。

      5、ArrayList 存放整型元素,调用remove方法是按照下标移除还是按照元素移除?

      当集合添加元素为数字时,添加进去的元素自动装箱成Integer类型。我们在删除元素时,如果直接传入参数,会被当作索引处理。

      ArrayList list = new ArrayList(0);
      list.add(1);
      list.add(3);
      list.remove(3);
      // 输出:class java.lang.Integer
      System.out.println(list.get(0).getClass());
      // 抛出异常:IndexOutOfBoundsException
      list.remove(3);
      // 正常删除
      list.remove(new Integer(3));

      6、Java 的快速失败和安全失败

      快速失败(fail—fast)

      用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出 ConcurrentModificationException

      原理: 迭代器在遍历时直接访问集合中的内容,并且在遍历过程中会判断 modCount 和expectedmodCount是否相等。两者相等的情况下才会进行迭代。集合在被遍历期间如果内容发生变化,就会改变 modCount 的值,然后导致两者不相等,会抛出异常,终止遍历

      注意:通过源码可以看出,虽然做了很多判断,但是并不能保证线程安全。如果正好在判断以后修改了 modCount 的值,并且 elementData 的长度满足条件,那么这次迭代还是能正常运行的。因此,不能依赖于这个异常是否抛出而进行并发操作的编程,这个异常只建议用于检测并发修改的 bug。

      场景: java.util 包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。

      安全失败(fail—safe)yuanmaa

      采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

      所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发 ConcurrentModificationException。

      场景: java.util.concurrent 包下的容器都是安全失败,可以在多线程下并发使用和修改。

      7、ArrayList 的扩容为什么是 1.5 倍?

      扩容参数为 (1, 2) 之间比较好。

      假设扩容参数为 x,当 x >= 2 时,每次扩展的新尺寸必然刚好大于之前分配的总和

      也就是说之前的内存空间都不能进行复用。

      IF x = 2 :
      caps: 1 2 4 8 16 32
      ---
      1
       12
         1234
             12345678
                     123456789012345
                                    12345678901234567890123456789012
      
      IF x = 1.5 :
      caps: 1 2 3 4 6 9 13 19 28
      ---
      1
       12
         123
            1234
      123456
            123456789
                     1234567890123
                                  1234567890123456789
      1234567890123456789012345678

      可以看到,k = 1.5 在几次扩展之后,可以重用之前的内存空间。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_15812995/9063892,作者:图书馆的小豆,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Python输出带颜色字体封装类

      下一篇:shell的多进程并发程序

      相关文章

      2025-05-19 09:04:14

      复杂度的OJ练习

      复杂度的OJ练习

      2025-05-19 09:04:14
      代码 , 复杂度 , 思路 , 数组 , 算法
      2025-05-16 09:15:24

      jQuery遍历对象、数组、集合

      jQuery遍历对象、数组、集合

      2025-05-16 09:15:24
      jQuery , 对象 , 数组 , 遍历 , 集合
      2025-05-16 09:15:24

      如何将一串数字用函数的方法倒过来(C语言)

      如何将一串数字用函数的方法倒过来(C语言)

      2025-05-16 09:15:24
      函数 , 数字 , 数组
      2025-05-16 09:15:17

      递归,搜索,回溯算法(3)之穷举,暴搜,深搜,回溯,剪枝

      递归,搜索,回溯算法(3)之穷举,暴搜,深搜,回溯,剪枝

      2025-05-16 09:15:17
      回溯 , 子集 , 数组 , 算法 , 递归
      2025-05-14 10:33:31

      计算机小白的成长历程——习题演练(函数篇)

      计算机小白的成长历程——习题演练(函数篇)

      2025-05-14 10:33:31
      函数 , 字符串 , 数组 , 知识点 , 编写 , 迭代 , 递归
      2025-05-14 10:33:31

      计算机小白的成长历程——数组(1)

      计算机小白的成长历程——数组(1)

      2025-05-14 10:33:31
      strlen , 个数 , 元素 , 内存 , 十六进制 , 地址 , 数组
      2025-05-14 10:33:16

      30天拿下Rust之向量

      在Rust语言中,向量(Vector)是一种动态数组类型,可以存储相同类型的元素,并且可以在运行时改变大小。向量是Rust标准库中的一部分,位于std::vec模块中。

      2025-05-14 10:33:16
      Rust , 使用 , 元素 , 向量 , 方法 , 索引 , 迭代
      2025-05-14 10:33:16

      30天拿下Rust之切片

      在Rust中,切片是一种非常重要的引用类型。它允许你安全地引用一段连续内存中的数据,而不需要拥有这些数据的所有权。切片不包含分配的内存空间,它仅仅是一个指向数据开始位置和长度的数据结构。

      2025-05-14 10:33:16
      amp , end , 切片 , 字符串 , 引用 , 索引 , 迭代
      2025-05-14 10:07:38

      30天拿下Python之迭代器和生成器

      在Python中,迭代器是一个非常重要的概念,它使得我们能够遍历一个序列而无需使用索引。迭代器不仅限于列表、元组、字符串等,我们也可以创建自定义的迭代器对象。

      2025-05-14 10:07:38
      Python , 使用 , 函数 , 生成器 , 返回 , 迭代 , 遍历
      2025-05-14 10:02:48

      typescript 将数组清空

      在TypeScript或JavaScript开发中,数组是用于存储和管理一组数据的基础数据结构。当需要清空一个数组时,有多种方法可以实现,而选择合适的方法不仅影响代码的可读性,还会对性能产生一定的影响。不同场景下,选择适合的清空数组的方法至关重要。

      2025-05-14 10:02:48
      length , pop , 引用 , 数组 , 方法
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5238713

      查看更多

      最新文章

      复杂度的OJ练习

      2025-05-19 09:04:14

      如何将一串数字用函数的方法倒过来(C语言)

      2025-05-16 09:15:24

      30天拿下Rust之向量

      2025-05-14 10:33:16

      30天拿下Python之迭代器和生成器

      2025-05-14 10:07:38

      Java 两个小时以后

      2025-05-13 09:50:28

      用go语言,现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号 给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges

      2025-05-13 09:49:12

      查看更多

      热门文章

      Arrays类的使用

      2023-06-08 06:23:00

      Java 数组与ArrayList的互转

      2023-03-07 09:14:38

      Java反转一个List或ArrayList

      2023-04-11 10:15:50

      Java for循环删除ArrayList重复元素陷阱,Iterator迭代器遍历删除重复元素

      2023-04-13 09:48:57

      Java从ArrayList指定position位置开始删除后面全部子元素

      2023-04-13 09:37:51

      Python编程:pkgutil获取包里面的所有模块列表

      2023-03-16 07:45:06

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      php如何互换一个数组的首尾元素 中间不变 首尾互换

      找出最多可以选出的元素数量

      零基础玩转C语言系列第五章——数组模块

      用go语言,给定一个长度为n的数组nums和一个正整数k, 找到数组中所有相差绝对值恰好为k的子数组, 并返回这些子数组中元素之和的最大值。

      Java集合的常见面试题(全)

      Java基础(16)-数组

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号