Q:

Shift all elements in a 2-dimensional array down

I wanted to know if there's a good way of decrementing the row-index of all non-zero elements in a 2-dimensional array.  For example, to shift all non-zero elements to the left:
[0, 1, 0, 1, 1] =>
[1, 0, 1, 1, 0]

A simple algorithm to do this would obviously be:
for (int[] row : array) {
    for (int i = 0; i < row.length - 1; i++) {
        row[i] = row[i + 1];
    }

    row[row.length - 1] = 0;
}

I could also do it like this:
for (int[] row : array) {
    System.arraycopy(row, 1, row, 0, row.length - 1);
    row[row.length - 1] = 0;
}

The simple algorithm to shift all elements down from index:
for (int col = 0; col < arr[0].length; col++) {
    for (int row = index; row > 0; row--) {
        arr[row][col] = arr[row - 1][col];
    }
}

I cannot, however, do System.arraycopy when doing this with row indices. 
Now what I wanted to know is, is there a better way of shifting the elements down other than looping through the whole matrix like above? 

A:

Now what I wanted to know is, is there a better way of shifting the elements down other than looping through the whole matrix like above? 

Define better :-). 
There is no way to get rid of the outer loop that is going to improve performance or (IMO) readability. 
As for the inner loop, the performance benefit of using arraycopy is likely to be small ... or even negative, if the arrays are small. 
If you have evidence that the performance will really make a practical difference, then I would recommend:

Profile the code to verify this. 
Trying both (and other) alternatives and measuring the affect on your overall application.