Your example output is all the tuples of the Cartesian product of your three arrays (not the permutations, which would mix the orders, too). Typically the Cartesian product is constructed with nested loops.
In Java (GWT) this could be done like this.
List<String> result = new ArrayList<String>();
for(int i=0; i<array1.length; i++) {
for(int j=0; j<array1.length; j++) {
for(int k=0; k<array1.length; k++) {
result.add(array1[i]+array2[j]+array3[k]);
}
}
}
For the Cartesian product when the number of arrays is not hard-coded, you can build a 2D m by n array of all the indices you require; in this case m will be the product of the lengths of the arrays and n will be the number of arrays. Following your example, this array would look like
0, 0, 0
0, 0, 1
0, 0, 2
0, 1, 0
0, 1, 1
...
Constructing this array requires some bookkeeping. I'd do it column by column. For example if you have three arrays of lengths l1, l2, and l3, then the last column is constructed from a loop index mod l3. The second column has the values from a loop index mod l2, but each value is repeated l3 times. The first column has the values mod l1, but each is repeated l2*l3 times. You could build the repeated values using a counters: one for the row number and one for the value: e.g., when the row number mod l3 is zero, increment the counter for the value, so each value gets l3 rows.
Actually, this more general question is also answered at
Perfoming Cartesian product on arrays