== Why is this an issue?

Using a loop to copy an array or a subset of an array is simply wasted code when there are built-in functions to do it for you. Instead, use ``++Arrays.copyOf++`` to copy an entire array into another array, use ``++System.arraycopy++`` to copy only a subset of an array into another array, and use ``++Arrays.asList++`` to feed the constructor of a new list with an array.


Note that ``++Arrays.asList++`` simply puts a ``++Collections++`` wrapper around the original array, so further steps are required if a non-fixed-size ``++List++`` is desired.


=== Noncompliant code example

[source,java]
----
public void makeCopies(String[] source) {

  this.array = new String[source.length];
  this.list = new ArrayList(source.length);

  for (int i = 0; i < source.length; i++) {
    this.array[i] = source[i]; // Noncompliant
  }

  for (String s : source) {
    this.list.add(s); // Noncompliant
  }
}
----


=== Compliant solution

[source,java]
----
public void makeCopies(String[] source) {
  this.array = Arrays.copyOf(source, source.length);
  Collections.addAll(this.list, source);
}
----


=== Exceptions

Rule detects only the most idiomatic patterns, it will not consider loops with non-trivial control flow. For example, array elements that are copied conditionally are ignored.

[source,java]
----
public int[] getCopy(int[] source) {
  int[] dest = new int[source.length];
  for (int i = 0; i < source.length; i++) {
    if (source[i] > 10) {
      dest[i] = source[i];  // Compliant
    }
  }
  return dest;
}
----


ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Use "Arrays.copyOf", "Arrays.asList", "Collections.addAll" or "System.arraycopy" instead.


'''
== Comments And Links
(visible only on this page)

=== on 23 Jul 2015, 07:14:19 Nicolas Peru wrote:
I slightly changed the title to make it clearer. Please double check. 

=== on 23 Jul 2015, 09:06:29 Ann Campbell wrote:
Thanks [~nicolas.peru].

endif::env-github,rspecator-view[]
