Fixed-size {@link Table} implementation backed by a two-dimensional array.
The allowed row and column keys must be supplied when the table is created. The table always contains a mapping for every row key / column pair. The value corresponding to a given row and column is null unless another value is provided.
The table's size is constant: the product of the number of supplied row keys and the number of supplied column keys. The {@code remove} and {@code clear} methods are not supported by the table or its views. The {@link #erase} and {@link #eraseAll} methods may be used instead.
The ordering of the row and column keys provided when the table is constructed determines the iteration ordering across rows and columns in the table's views. None of the view iterators support {@link Iterator#remove}. If the table is modified after an iterator is created, the iterator remains valid.
This class requires less memory than the {@link HashBasedTable} and {@link TreeBasedTable} implementations, except when the table is sparse.
Null row keys or column keys are not permitted.
This class provides methods involving the underlying array structure, where the array indices correspond to the position of a row or column in the lists of allowed keys and values. See the {@link #at}, {@link #set}, {@link #toArray}, {@link #rowKeyList}, and {@link #columnKeyList} methods for moredetails.
Note that this implementation is not synchronized. If multiple threads access the same cell of an {@code ArrayTable} concurrently and one of thethreads modifies its value, there is no guarantee that the new value will be fully visible to the other threads. To guarantee that modifications are visible, synchronize access to the table. Unlike other {@code Table}implementations, synchronization is unnecessary between a thread that writes to one cell and a thread that reads from another.
@author Jared Levy
@since Guava release 10