Java如何将两个数组的元素按顺序合并

本文探讨了使用Java的ArrayList进行数组合并的方法及效率分析。通过对比以不同数组为主进行合并时的选择,揭示了在面对不同数据量时,for循环与addAll方法的优劣。同时,文中还指出了在数组合并过程中常见的错误用法,并提供了避免这些错误的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日记里面的老文章了,贴csdn里面方便查看。


使用java的ArrayList 的时候,如何将两个数组按顺序合并。

考虑问题的角度不同,解决办法就不一样。例如ArrayList a 和b ,合并之后为 a1 a2 b1 b2

1,以a为主数组的话,解决办法很简单。 for循环遍历。和 a.addAll(b)

2, 如果以b为主数组的话,问题就有点复杂了。 解决办法是 倒序遍历数组a,b.add(0, a[n])

所以我们解决问题的时候,如果某个想法有点复杂的话,那么可能是你站的角度的问题。换个角度问题就拨云见日了。

for循环和addAll效率问题

对于答案1,引出了一个问题。for循环和addAll那个更高效。

1,在小数据量时,for循环效率高,大数据量时addAll方法效率高:

原因如下:

ArrayList的addAll的实现为:

public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew= a. length ;
ensureCapacity( size +numNew); // Increments modCount
System.arraycopy(a, 0, elementData , size ,numNew);
size +=numNew;
return numNew!= 0;
}

很显然。。在拷贝数组时使用了arraycopy 这个方法。这个方法是使用拷贝内存的做法 ,效率比遍历数组块很多。

arraycopy的定义是这样的

public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);

native关键字的意思是 这个函数的源码在JDK中没有的。但是他调用的是本地函数,这个函数是C,或者C++写完的,编译成DLL。 java调用。所以效率比较高。

首先找到数据源 然后将该段内存拷贝。

但是如果需要多次遍历,那么addAll还是在性能上会获取优势的. .

下面是网上的一个测试 在20组数据时 还是 for效率高,但是在大数据量的时候 arraycopy 方法就明显占优势了。
http://www.exam8.com/computer/djks/dj2/Java/ziliao/200810/1314435.html

常见错误用法:
1,忘记new初始化对象
// 一些朋友在向循环里向列表增加对象的时候
  // 经常忘记new初始化,造成最终加入的都是同一个对象
  List<MyObject> list = new ArrayList<MyObject>();
  MyObject obj = new MyObject();
  for (int i = 1; i <= 5; i++) {
   obj.setName("Name" + i);
   list.add(obj);
  }
  // 里面的数据都是最后一个
  showList(list); // [Name5, Name5, Name5, Name5, Name5]
 
   
2,忘记ArrayList初始化
3,遍历的时候删除数据


参考:







### 合并两个数组一个数组Java实现 当面对需要将两个已排序整数数组 `A` 和 `B` 合并一个新的有序数组的任务时,可以采用双指针方法来高效完此操作。这种方法不仅能够保持最终结果的顺序性,而且可以在O(n+m)的时间复杂度内运行,其中n和m分别是输入数组的长度。 下面是一个具体的Java代码示例: ```java public class MergeArrays { public static int[] mergeTwoSortedArrays(int[] A, int[] B) { int n = A.length; int m = B.length; int[] result = new int[n + m]; int i = 0, j = 0, k = 0; while (i < n && j < m) { if (A[i] <= B[j]) { result[k++] = A[i++]; } else { result[k++] = B[j++]; } } while (i < n) { result[k++] = A[i++]; } while (j < m) { result[k++] = B[j++]; } return result; } public static void main(String[] args) { int[] A = {1, 2, 3, 4}; int[] B = {2, 4, 5, 6}; int[] mergedArray = mergeTwoSortedArrays(A, B); System.out.println(java.util.Arrays.toString(mergedArray)); } } ``` 这段程序定义了一个名为`mergeTwoSortedArrays`的方法,该方法接收两个参数——即待合并两个整型数组,并返回它们按升序排列后的组合版本[^4]。通过比较来自两个数组中的当前最小值并将较小者放入目标数组的方式逐步构建新的有序列表。一旦其中一个原始数组被完全处理完毕,则直接复制另一个剩余部分至输出序列即可[^2]。 对于给定的例子而言,执行上述函数将会得到预期的结果 `[1, 2, 2, 3, 4, 4, 5, 6]`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值