# Java Notes

# Array Library Methods

Static methods for manipulating arrays are available in the `java.util.Arrays` and `java.System` classes. Assume the following declarations, where `T` is the array element type, either a primitive, object or either kind of type depending on which method is being called.

    T       x, key;  // This type T can be either a primitive or object type.
    T[]     a, a2;   // This type T can be either a primitive or object type.
    List<T> lst;     // Only object types T.
    Comparator<? super T> comp;  // Only object types T.
    int     i;    // Index returned from search.
    int     i1, i2;
    int     from; // Lower bound of subscript range.  Includes this element.
    int     to;   // Upper bound of subscript range.  Does not include this element.
    String  s;
    boolean b;  // Normally the method result will be used in an if.

`lst =` | `Arrays.asList(a);` | List based on the array.
`s =` | `Arrays.toString(a);` | String form surrounded by "[]", elements separated by ", ".
`s =` | `Arrays.deepToString(a);` | String form by recursively converting subarrays.
`b =` | `Arrays.equals(a, a2);` | True if arrays are same size and all elements are equal (== or equals as appropriate).
`b =` | `Arrays.deepEquals(a, a2);` | As above, recursively applied to subarrays.
`` | `Arrays.fill(a, x);` | Fills array with a value.
`` | `Arrays.fill(a, from, to, x);` | Fills subrange (from inclusive, to exclusive) with a value.
Making a copy of part of an array
`` | `System.arraycopy(a, i1, a2, i2, len);` | Shallow copy len elements from `a[i1]` to `a2[i2]`. Case!
`a2 =` | `Arrays.copyOf(a, newLength);` | New shallow copy of array with new length. If longer, uses default values.
`a2 =` | `Arrays.copyOfRange(a, from, to);` | New shallow copy of portion of array.
Searching
`i =` | `Arrays.binarySearch(a, key);` | A O(log N)search of array sorted in ascending order. If the key is not found, a negative number, -insertionPoint-1, is returned.
`i =` | `Arrays.binarySearch(a, key, comp);` | Binary search of a sorted array of objects (not primitives).
Sorting. See Sorting Arrays for more on sorting and comparators.
`` | `Arrays.sort(a);` | Sorts in "natural" order. If object type, elements must be comparable.
`` | `Arrays.sort(a, comp);` | Sorts objects (not primitives) using comparator.
`` | `Arrays.sort(a, from, to);` | Sorts subrange, including `a[from]` excluding `a[to]`.
`` | `Arrays.sort(a, from, to, comp);` | Sorts objects (not primitives) in subrange using comparator.

## Use `java.util.Arrays.toString(...)` for debugging

AVOID default toString(). Using the common debugging technique of printing intermediate values on the console with arrays is good, but requires calling a library method to get the results you expect. Arrays are a subclass of `Object` as ever other object is, and therefore the `toString()` method is defined for every array. The results will very likely disappoint you.

    String[] abc = {"a", "b", "c"};
    System.out.println(abc);   // println calls toString() on object parameters.

This displays the relatively unhelpful "[L", element type, ";@", and hexadecimal memory address of the array.

    [Ljava.lang.String;@f6f1b6

USE `java.util.Arrays.toString(...)` and you'll get something much more readable. An `import java.util.*;` statement avoids the extra package qualifier.

    String[] abc = {"a", "b", "c"};
    System.out.println(java.util.Arrays.toString(abc));

This produces the following output, which is the same as `toString()` applied to a List.

    [a, b, c]

## Use `Arrays.asList(...)` for Collections view of array

Make a list. The `Arrays` class has some useful methods for working with arrays, but there are a lot more if you make your array look like a List. The Collections class has many useful methods, eg, shuffle, reverse, max, .... See Collections Class.

    import java.util.*;
        . . .
        List<String> listabc = Arrays.asList(abc);
        // The Collections methods can now be use with listabc.

View of underlying array. The list that is created is not a regular `ArrayList`. It is based only on the original array, so you can't do things like adding elements to the list because this would cause reallocation of a larger underlying array.

Uses the underlying array. One of the really nice things about this is that you can still use the underlying array, which means that creating this list doesn't prevent you from taking advantage of the efficiency of array access for example.

Objects only. The `java.util.Arrays.asList(...)` method only works for arrays of object types. If you try to use it with an array of primitives, you will get a compilation error.

## Shuffling (randomizing) an array

    import java.util.*;
    . . .
        List<String> labc = Arrays.asList(abc);
        . . .
        Collections.shuffle(labc);
        System.out.println(labc);

Which gave the following output. Note that the `List` overrides `toString()` to give reasonable output.

    [b, a, c]

Inefficient? Not necessarily. Constructing a new List object from the array is only inefficient if you're doing it frequently. If you do it very often then you want to avoid creating a new list each time. Creating the list one time is not a problem because the list that is produced is backed by this one array -- you can change elements in the array and the list will reflect those changes.

### Can't shuffle arrays of primitives this way!

Lists and other Collections classes only work on objects, not on primitive values, so you have to do the shuffling "by hand". See Random Numbers - shuffling for how to do it yourself.

## Commentary

A `shuffle(...)` method that works with primitive types should be added to the `Arrays` class.