发布于2026-07-06 阅读(0)
扫一扫,手机访问
动态数组扩容这件事,其实很多开发者都搞错过一个核心认知:它不是给原数组原地“加空间”,而是创建一份新空间、把数据搬过去、再把旧指针换掉。说得更直白一点:它不是“原地扩建”,而是先找块更大的新内存,然后把数据完整搬过去,最后把指针指向新家,旧地址彻底废弃。那么问题来了——到底怎么搬?系统提供的那几个函数,关键作用是把“搬数据”这一步做得更安全、更高效,而不是让你去写一堆容易出错的for循环。

Ja va里最底层、也最可控的数组复制方式,就是System.arraycopy。适合那些需要精确控制起始位置和复制长度的场景。
System.arraycopy(源数组, 源起始索引, 目标数组, 目标起始索引, 复制元素个数)int[] old = {1,2,3,4,5};
int[] newarr = new int[8];
System.arraycopy(old, 0, newarr, 0, old.length); // 复制全部5个元素相比System.arraycopy,大多数时候我们更愿意用Arrays.copyOf——它本质上就是对前者的一层封装,一行代码同时完成“新建”和“复制”,适合日常扩容需求。
Arrays.copyOf(original, newLength) —— 类型由original推导,新数组多余位置用默认值填充手动管理动态数组时,千万别再用原始for循环逐个赋值了。标准库提供了更安全、可读性更高的迁移方式。
std::copy(oldData, oldData + size, newData);memmove(newData, oldData, size * sizeof(T));C语言里有realloc这个“看上去很省事”的机制,但它在工程实践中其实暗藏不少坑:
所以,正确的姿势就是老老实实用上面那些——每一个都经过了大量工程检验,远比realloc靠谱得多。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8