How do I do a deep copy of a 2d array in Java?
Yes, you should iterate over 2D boolean array in order to deep copy it. Also look at java.util.Arrays#copyOf
methods if you are on Java 6.
I would suggest the next code for Java 6:
public static boolean[][] deepCopy(boolean[][] original) {
if (original == null) {
return null;
}
final boolean[][] result = new boolean[original.length][];
for (int i = 0; i < original.length; i++) {
result[i] = Arrays.copyOf(original[i], original[i].length);
// For Java versions prior to Java 6 use the next:
// System.arraycopy(original[i], 0, result[i], 0, original[i].length);
}
return result;
}
Cloning two-dimensional Arrays in Java
you should iterate this array with two loops. This will helps you:
static double[][] clone(double[][] a) {
double[][] b = new double[a.length][];
for (int i = 0; i < a.length; i++) {
b[i]= new double[a[i].length];
for (int j = 0; j < a[i].length; j++)
b[i][j] = a[i][j];
}
return b;
}
How do I copy a 2 Dimensional array in Java?
current=old
or old=current
makes the two array refer to the same thing, so if you subsequently modify current
, old
will be modified too. To copy the content of an array to another array, use the for loop
for(int i=0; i<old.length; i++)
for(int j=0; j<old[i].length; j++)
old[i][j]=current[i][j];
PS: For a one-dimensional array, you can avoid creating your own for loop by using Arrays.copyOf
How to deep copy 2 dimensional array (different row sizes)
I think what you mean is that the column size isn't fixed. Anyway a simple straightforward way would be:
public int[][] copy(int[][] input) {
int[][] target = new int[input.length][];
for (int i=0; i <input.length; i++) {
target[i] = Arrays.copyOf(input[i], input[i].length);
}
return target;
}
How to clone a multidimensional array in java?
When the above code is run, arrayMaster changes as well as arrayChanges, contrary to my intentions.
The line
static private int[][] arrayChanges = arrayMaster;
is the culprit. This line makes arrayChanges
and arrayMaster
point to the same object, so a change to either one is visible when you access the object from either.
EDIT: What happens whenever you clone one dimension of a multidimensional array
As Eric Lippert explains, an array is conceptually a list of variables. If you just assign another variable to point to the same array a la static private int[][] arrayChanges = arrayMaster;
, you haven't changed the set of variables at all. You haven't created any new variables except for arrayChanges
, so you haven't gotten more memory from the operating system/JVM, so any change you make to arrayMaster
is applied to arrayChanges
and vice versa.
Now let's look at a two-dimensional array. In Java, a two-dimensional array is a list of variables that happens to have the property that each one of these variables refers to a one-dimensional array. So, whenever you clone a two-dimensional array, you create a new list of variables, each pointing in the same place that the old variables pointed in. So, you have gained a little in that you can safely write arrayChanges[0] = new int[10]
without affecting arrayMaster
, but as soon as you start referencing arrayChanges[i][j]
you are still referencing the same second-level arrays that arrayMaster
references. What you really want in order to deep-copy a two-dimensional array of ints is
public static int[][] deepCopyIntMatrix(int[][] input) {
if (input == null)
return null;
int[][] result = new int[input.length][];
for (int r = 0; r < input.length; r++) {
result[r] = input[r].clone();
}
return result;
}
To those who may look at this answer in the future: yes, it is better replace int
with T
here and make the method generic, but for this purpose a more concrete deep copy method is simpler to explain well.
How to deep copy a 2d String array?
You can use either of these:
- Arrays.copyOf()
- System.arraycopy()
- Object clone() method
If you are looking for more advanced library with cloning api's you can check
org.apache.commons.lang3 SerializationUtils
Related Topics
What Is "String Args[]"? Parameter in Main Method Java
How to Override Equals Method in Java
Polymorphism VS Overriding VS Overloading
Spring Boot Configure and Use Two Data Sources
Javac Is Not Recognized as an Internal or External Command, Operable Program or Batch File
Convert a Json String to Object in Java Me
Hashmap With Multiple Values Under the Same Key
Number of Lines in a File in Java
Spring @Transactional Not Auto Rolling Back During Unchecked Exception
Syntax For Creating a Two-Dimensional Array in Java
Using Threads to Make Database Requests
Ways to Iterate Over a List in Java
Java Process With Input/Output Stream
How to Write Contents of a Java Inputstream to an Outputstream
Classpath Including Jar Within a Jar