如何在数组中添加数据:主流写法对比
如何在数组中添加数据,主流分为尾部追加、头部插入、指定下标插入三种方式,JavaScript、Python、Java语言实现逻辑不同,尾部追加性能普遍更好,头部插入会移动原有元素,大批量数据场景下尽量少用头部插入,固定长度数组不支持直接新增元素,只能覆盖原有下标位置的值。
数组尾部添加数据
尾部追加是向数组添加数据里使用频次较高的方式,不会打乱已有元素的下标顺序。JavaScript里使用push方法,传入一个或者多个值,执行后返回数组新长度;Python调用append方法,一次只能添加单个元素,想要批量添加则使用extend,extend会把传入可迭代对象拆开并入数组;Java里ArrayList调用add方法只传参数时,默认追加到末尾。这个操作底层大多只需要扩容判断,不需要移动已有元素,在十万条以内数据的常规业务场景,耗时波动较小。
别混淆append和extend,你给append传列表,它会把整个列表当成一个元素存入。
数组头部添加数据
头部插入会把原有全部元素向后移动一位,再把新值放在下标0的位置。JavaScript使用unshift,可以一次性传入多个数据;Python用insert,第一个参数写0代表头部;Java的ArrayList调用add(0,数据)实现。数据量越大,这个操作开销越高,数组长度上万时,连续多次头部插入会明显拖慢代码运行速度,这种场景优先考虑反转数组或者改用链表结构。
数组指定下标添加数据
指定位置插入,新元素占据填写的下标,原下标及之后所有元素统一后移。JavaScript没有内置insert函数,需要用splice,格式为splice(插入下标,0,新增数据),第二个参数固定填0代表只插入、不删除元素;Python的insert(下标,值)直接完成操作;JavaArrayList同样是add(下标,数据)。插入下标不能超出数组当前长度,Python允许下标等于数组长度,等价于尾部追加,JavaScript和Java超出范围会抛出报错或者不生效。
| 语言 | 尾部添加 | 头部添加 | 指定下标添加 |
|---|---|---|---|
| JavaScript | push() | unshift() | splice(pos,0,val) |
| Python | append()/extend() | insert(0,val) | insert(pos,val) |
| JavaArrayList | add(val) | add(0,val) | add(pos,val) |
固定长度数组,也就是Java基础数组、JavaScripttypedarray,长度初始化之后无法扩容,不能新增元素,只能修改已有下标位置的值,你如果需要动态增减数据,优先选择动态数组容器。
数组是连续内存结构。
批量添加数据时,不要循环调用单次插入方法,循环insert或者unshift会反复触发元素移动,累积开销很高。JavaScript可以先把数据放到临时数组,再用concat合并;Python用extend一次性并入可迭代对象;Java可以先构造集合,再调用addAll完成批量写入,减少内存复制次数。
插入引用类型数据时,存入数组的是内存引用,不是数据副本,后续修改原变量,数组内对应的内容也会跟着变化,如果你需要独立副本,添加前要手动完成拷贝。
插入下标为负数时,Python会从数组末尾反向定位,JavaScriptsplice负数下标从末尾向前计算起点,两者处理逻辑不一样,跨语言复用代码时要单独校验下标取值,避免插入位置和预期不符。
