如何复制二维字符串数组?

Lil*_*ily 4 java arrays string pointers

我正在使用一个使用二维数组字符串的程序(可能不是那么聪明,但是呃),我想写一个函数来接受其中一个数组(比如说array1),make一个独立的副本,并返回它(比如说array2).但是,当我在array2中更改一个值时,它似乎反映在array1中.

我的功能目前看起来像这样:

public static String[][] copy(String[][] matrix, int n) {
    String[][] out = new String[n+1][n+1];
    for (int i = 0; i < n+1; i++) 
        for (int j = 0; j < n+1; j++) {
            if(matrix[i][j] != null) {
                String cp = new String(matrix[i][j]);
                out[i][j] = cp;
            }

        }

    return out;
}
Run Code Online (Sandbox Code Playgroud)

我声明了一个新的字符串数组,然后遍历它,分别复制每个值.当这不起作用时,我甚至尝试从每个旧字符串中明确声明一个新字符串并将其放入数组中.

谁能告诉我哪里出错了?

eri*_*son 5

我不确定n参数是什么,但如果我需要这样的函数,我会使用这样的东西:

public static String[][] copy(String[][] matrix) {
  String[][] copy = new String[matrix.length];
  for (int idx = 0; idx < matrix.length; ++idx)
    copy[idx] = matrix[idx].clone();
  return copy;
}
Run Code Online (Sandbox Code Playgroud)

您不需要创建它的副本String,因为它们是不可变的.正如Michael在评论中指出的那样,String(String)如果原始字符串是作为某个非常大的字符串的子字符串创建的,那么构造函数可能会很有用.另一个用途是当您使用String对象作为锁(不推荐),并希望私有实例避免死锁.

另外,在分配之前检查元素是否为空是不必要的; 如果您正确设置了循环,则该元素保证为null.(如果不是,覆盖它有什么害处呢?)