迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

在 Java 中复制二维数组

作者:迹忆客 最近更新:2023/09/11 浏览次数:

每当我们尝试将二维数组的元素复制到另一个数组时,我们通常会将一个原始数组分配给目标数组。为什么这种方法在逻辑上是错误的,我们将首先讨论它。

尽管下面提到的解决方案在逻辑上是错误的,但我们想让你知道为什么这个解决方案不起作用。

// Java Program to copy 2-dimensional array
// create 2D array
int [ ][ ] arr1 = { {2,4,6}, {8,10,12} };
// creating the same array with the same size
int [ ] [ ] arr2 = new int[arr1.length];
// this code does not copy elements of arr1[ ] to arr2[ ] because arr2[ ] sill refer to the same location
arr2 = arr1;

当我们写 arr2=arr1 时,我们正在分配 arr2[ ]arr1[ ] 的引用。因此,更改一个数组将同时反映在复制的数组和原始数组中,因为两个数组都指向同一个位置。

为了证明这一事实,请查看下面描述的代码。

// A Java program to demonstrate assigning an array reference doesn't make any sense

public class copy2DArray{
   public static void main(String []args){
       // Create an array arr1[]  
          int [][] arr1 = { {2,4,5}, {6,8,10} };
       // Create an array arr2[] with the same size
          int [][] arr2 = new int[arr1.length][];
       // Doesn't copy elements of arr1 to arr2, but only arr2 starts refering arr1
          arr2 = arr1;
       // Any changing in the arr2 also reflects in the arr1 because
       // both are referin to the same location
          arr2 [0][0] = 88;
          System.out.println("Elements of arr1[] are:");
          for (int i=0; i<arr1.length; i++){
            for (int j=0; j<arr1.length; j++){
               System.out.println(arr1[i][j] + " ");
            }
        }
          System.out.println("\n\nElements of arr2[] are:");
          for (int i=0; i<arr2.length; i++){
            for (int j=0; j<arr2.length; j++){
               System.out.println(arr2[i][j] + " ");
            }
	 }
   }
}

输出:

Elements of arr1[] are:
88
4
6
8
Elements of arr2[] are:
88
4
6
8

在上面的示例中,我们讨论了开发人员在复制二维数组元素时经常犯的常见错误。现在我们将讨论完成相同任务的正确方法。

在 Java 中,我们可以使用以下方法复制数组元素:

  1. 迭代数组的所有元素并复制每个元素。
  2. 通过使用 clone() 方法。
  3. 通过使用 arraycopy() 方法。

在 Java 中使用循环迭代复制二维数组

用于复制二维数组的循环迭代技术。使用此方法,你将体验到任何目标或原始数组修改都不会影响原始数组。因此,原始数组保持不变。

// A Java program to demonstrate assigning an array reference doesn't make any sense
import java.util.Arrays;
public class copy2DArray{
   public static void main(String [ ]args){
      // Create an array arr1[ ]  
         int [ ][ ] arr1 = { {2,4,5}, {6,8,10} };
      // Create an array arr2[ ] with the same size
         int [ ][ ] arr2 = new int[arr1.length][ ];
      // Copying elements of arr1[ ] to arr2[ ]
         for(int i = 0; i < arr1.length; i++){
      // allocation space to each row of arr2[]
            arr2[i] = new int[arr1[i].length];    
            for(int j= 0; j<arr1[i].length; j++){
                arr2[i][j] = arr1[i][j];
           }
        }

    // Any change in the elements of arr2[ ] will not be reflected  in an original array
        arr2[0][0] = 90;
       System.out.println("Elements of arr1[] are:");
        for (int i=0; i < arr1.length; i++){
           for (int j=0; j < arr1[0].length; j++){
               System.out.println(arr1[i][j] + " ");
            }
        }
      System.out.println("\n\nElements of arr2[] are:");
      for (int i=0; i < arr2.length; i++){
         for (int j=0; j < arr2[0].length; j++){
               System.out.println(arr2[i][j] + " ");
            }
        }
     }
}

输出:

Elements of arr1[] are:
2 
4
5 
6 
8
10 
Elements of arr2[] are:
90 
4 
5 
6 
8 
10

在 Java 中使用 clone() 方法复制二维数组

在之前的方法中,我们使用循环迭代技术来复制二维数组元素。我们可以使用 clone() 方法完成相同的任务。

// A Java program to demonstrate assigning an array reference doesn't make any sense

import java.util.Arrays;
public class copy2DArray{
  public static void main(String []args){
 // Create an array arr1[]  
    int [ ][ ] arr1 = { {2,4,5}, {6,8,10} };
 // Create an array arr2[] with the same size
    int [ ][ ] arr2 = new int[arr1.length][];
 // Copying elements of arr1[ ] to arr2[ ] using the clone() method
    for(int i = 0; i < arr1.length; i++)
          arr2[i] =  arr1[i].clone();
 // Any change in the elements of arr2[] will not be reflected in an original array
    arr2[0][0] = 90;
    System.out.println("Elements of arr1[] are:");
       for (int i=0; i < arr1.length; i++){
           for (int j=0; j < arr1[0].length; j++){
               System.out.println(arr1[i][j] + " ");
           }
        }
    System.out.println("\n\nElements of arr2[] are:");
    for (int i=0; i < arr2.length; i++){
      for (int j=0; j < arr2[0].length; j++){
           System.out.println(arr2[i][j] + " ");
           }
        }
    }

}

输出:

Elements of arr1[] are:
2 
4
5 
6 
8
10 
Elements of arr2[] are:
90 
4 
5 
6 
8 
10

在 Java 中使用 arraycopy() 方法复制二维数组

同样,我们可以使用 arraycopy() 方法复制二维数组。我们可以复制任何二维数组的元素,而无需使用此方法迭代所有数组元素。要使用此方法,我们需要提供以下参数:

  • src:你需要复制的源数组
  • srcPos:原始数组的起始位置。
  • dest:目标数组。
  • destPos:目标数组的起始索引。
  • length:我们要复制的二维数组元素的总数

例外:

  • NullPointerException:如果源或目标数组未定义或不存在。
  • ArrayStoreException:如果开发人员试图将整数数组类型复制到字符串数组中,这种情况会自动触发此异常。

例子:

package sampleProject;
import java.util.Arrays;
public class Codesample {
   public static void main(String []args){
// Create an array arr1[]  
   int [][] arr1 = { {2,4,5}, {6,8,10} };
// Create an array arr2[] with the same size
   int [][] arr2 = new int[arr1.length][];
// Copying elements of arr1[] to arr2[] using the clone() method
   for(int i = 0; i < arr1.length; i++) {
       arr2[i] =  new int[arr1[i].length];
    System.arraycopy(arr1[i], 0, arr2[i], 0, arr1[i].length);
    }
// Any change in the elements of arr2[] will not be reflected in an original array
   arr2[0][0] = 90;
   System.out.println("Elements of arr1[] are:");
   for (int i=0; i < arr1.length; i++){
       for (int j=0; j < arr1[0].length; j++){
           System.out.println(arr1[i][j] + " ");
          }

	}
   System.out.println("\n\nElements of arr2[] are:");
   for (int i=0; i < arr2.length; i++){
      for (int j=0; j < arr2[0].length; j++){
          System.out.println(arr2[i][j] + " ");
        }
      }
   }

}

输出:

Elements of arr1[] are:
2 
4
5 
6 
8
10 
Elements of arr2[] are:
90 
4 
5 
6 
8 
10

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 Java 中延迟几秒钟的时间

发布时间:2023/12/17 浏览次数:217 分类:Java

本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。

如何在 Java 中把 Hashmap 转换为 JSON 对象

发布时间:2023/12/17 浏览次数:187 分类:Java

它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。

如何在 Java 中按值排序 Map

发布时间:2023/12/17 浏览次数:171 分类:Java

本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map 进行排序,并列出了一些示例代码来理解它。

如何在 Java 中打印 HashMap

发布时间:2023/12/17 浏览次数:192 分类:Java

本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。

在 Java 中更新 Hashmap 的值

发布时间:2023/12/17 浏览次数:146 分类:Java

本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。

Java 中的 hashmap 和 map 之间的区别

发布时间:2023/12/17 浏览次数:79 分类:Java

本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,

在 Java 中获取用户主目录

发布时间:2023/12/17 浏览次数:218 分类:Java

这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。

Java 中 size 和 length 的区别

发布时间:2023/12/17 浏览次数:179 分类:Java

这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。

Java 中的互斥锁

发布时间:2023/12/17 浏览次数:111 分类:Java

了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便