UNPKG

epubjs

Version:

Render ePub documents in the browser, across many devices

239 lines (233 loc) 42.8 kB
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Arrays</title><link rel="stylesheet" href="core.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.74.0"/></head><body><div class="sect1" title="Arrays"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-4-SECT-7"/>Arrays</h1></div></div></div><p>An array is a special type of object that can hold an ordered collection of elements. The type of the elements of the array is called the <span class="emphasis"><em>base type</em></span> of the array; the number of elements it holds is a fixed attribute called its <a id="I_indexterm4_id687163" class="indexterm"/><span class="emphasis"><em>length</em></span>. Java supports arrays of all primitive and reference types.</p><p>The basic syntax of arrays looks much like that of C or C++. We create an array of a specified length and access the elements with the <a id="I_indexterm4_id687176" class="indexterm"/><span class="emphasis"><em>index</em></span> operator, <a id="I_indexterm4_id687184" class="indexterm"/><a id="I_indexterm4_id687194" class="indexterm"/><code class="literal">[]</code>. Unlike other languages, however, arrays in Java are true, first-class objects. An array is an instance of a special Java <a id="I_indexterm4_id687210" class="indexterm"/><code class="literal">array</code> class and has a corresponding type in the type system. This means that to use an array, as with any other object, we first declare a variable of the appropriate type and then use the <code class="literal">new</code> operator to create an instance of it.</p><p>Array objects differ from other objects in Java in three respects:</p><div class="itemizedlist"><ul class="itemizedlist"><li class="listitem"><p>Java implicitly creates a special array class type for us whenever we declare a new type of array. It’s not strictly necessary to know about this process in order to use arrays, but it helps in understanding their structure and their relationship to other objects in Java later.</p></li><li class="listitem"><p>Java lets us use the <code class="literal">[]</code> operator to access array elements so that arrays look as we expect. We could implement our own classes that act like arrays, but we would have to settle for having methods such as <code class="literal">get()</code> and <code class="literal">set()</code> instead of using the special <code class="literal">[]</code> notation.</p></li><li class="listitem"><p>Java provides a corresponding special form of the <code class="literal">new</code> operator that lets us construct an instance of an array with a specified length with the <code class="literal">[]</code> notation or initialize it directly from a structured list of values.</p></li></ul></div><div class="sect2" title="Array Types"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-4-SECT-7.1"/>Array Types</h2></div></div></div><p><a id="I_indexterm4_id687289" class="indexterm"/> <a id="idx10182" class="indexterm"/>An array type variable is denoted by a base type followed by the empty brackets, <code class="literal">[]</code>. Alternatively, Java accepts a C-style declaration with the brackets placed after the array name.</p><p>The following are equivalent:</p><a id="I_4_tt198"/><pre class="programlisting"> <code class="kt">int</code> <code class="o">[]</code> <code class="n">arrayOfInts</code><code class="o">;</code> <code class="c1">// preferred</code> <code class="kt">int</code> <code class="n">arrayOfInts</code> <code class="o">[];</code> <code class="c1">// C-style</code></pre><p>In each case, <code class="literal">arrayOfInts</code> is declared as an array of integers. The size of the array is not yet an issue because we are declaring only the array type variable. We have not yet created an actual instance of the <code class="literal">array</code> class, with its associated storage. It’s not even possible to specify the length of an array when declaring an array type variable. The size is strictly a function of the array object itself, not the reference to it.</p><p>An array of reference types can be created in the same way:<a id="I_indexterm4_id687352" class="indexterm"/></p><a id="I_4_tt199"/><pre class="programlisting"> <code class="n">String</code> <code class="o">[]</code> <code class="n">someStrings</code><code class="o">;</code> <code class="n">Button</code> <code class="o">[]</code> <code class="n">someButtons</code><code class="o">;</code></pre></div><div class="sect2" title="Array Creation and Initialization"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-4-SECT-7.2"/>Array Creation and Initialization</h2></div></div></div><p><a id="idx10132" class="indexterm"/> <a id="idx10180" class="indexterm"/>The <a id="I_indexterm4_id687403" class="indexterm"/><code class="literal">new</code> operator is used to create an instance of an array. After the <code class="literal">new</code> operator, we specify the base type of the array and its length with a bracketed integer expression:</p><a id="I_4_tt200"/><pre class="programlisting"> <code class="n">arrayOfInts</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">int</code> <code class="o">[</code><code class="mi">42</code><code class="o">];</code> <code class="n">someStrings</code> <code class="o">=</code> <code class="k">new</code> <code class="n">String</code> <code class="o">[</code> <code class="n">number</code> <code class="o">+</code> <code class="mi">2</code> <code class="o">];</code></pre><p>We can, of course, combine the steps of declaring and allocating the array:</p><a id="I_4_tt201"/><pre class="programlisting"> <code class="kt">double</code> <code class="o">[]</code> <code class="n">someNumbers</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">double</code> <code class="o">[</code><code class="mi">20</code><code class="o">];</code> <code class="n">Component</code> <code class="o">[]</code> <code class="n">widgets</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Component</code> <code class="o">[</code><code class="mi">12</code><code class="o">];</code></pre><p>Array indices start with zero. Thus, the first element of <code class="literal">someNumbers[]</code> is <code class="literal">0</code>, and the last element is <code class="literal">19</code>. After creation, the array elements are initialized to the default values for their type. For numeric types, this means the elements are initially zero:</p><a id="I_4_tt202"/><pre class="programlisting"> <code class="kt">int</code> <code class="o">[]</code> <code class="n">grades</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">int</code> <code class="o">[</code><code class="mi">30</code><code class="o">];</code> <code class="n">grades</code><code class="o">[</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="mi">99</code><code class="o">;</code> <code class="n">grades</code><code class="o">[</code><code class="mi">1</code><code class="o">]</code> <code class="o">=</code> <code class="mi">72</code><code class="o">;</code> <code class="c1">// grades[2] == 0</code></pre><p>The elements of an array of objects are references to the objects—just like individual variables they point to—but do not actually contain instances of the objects. The default value of each element is therefore <code class="literal">null</code> until we assign instances of appropriate objects:</p><a id="I_4_tt203"/><pre class="programlisting"> <code class="n">String</code> <code class="n">names</code> <code class="o">[]</code> <code class="o">=</code> <code class="k">new</code> <code class="n">String</code> <code class="o">[</code><code class="mi">4</code><code class="o">];</code> <code class="n">names</code> <code class="o">[</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="n">String</code><code class="o">();</code> <code class="n">names</code> <code class="o">[</code><code class="mi">1</code><code class="o">]</code> <code class="o">=</code> <code class="s">"Boofa"</code><code class="o">;</code> <code class="n">names</code> <code class="o">[</code><code class="mi">2</code><code class="o">]</code> <code class="o">=</code> <code class="n">someObject</code><code class="o">.</code><code class="na">toString</code><code class="o">();</code> <code class="c1">// names[3] == null</code></pre><p>This is an important distinction that can cause confusion. In many other languages, the act of creating an array is the same as allocating storage for its elements. In Java, a newly allocated array of objects actually contains only reference variables, each with the value <code class="literal">null</code>.<sup>[<a id="learnjava3-CHP-4-FNOTE-5" href="#ftn.learnjava3-CHP-4-FNOTE-5" class="footnote">11</a>]</sup> That’s not to say that there is no memory associated with an empty array; memory is needed to hold those references (the empty “slots” in the array). <a class="xref" href="ch04s07.html#learnjava3-CHP-4-FIG-4" title="Figure 4-4. A Java array">Figure 4-4</a> illustrates the <code class="literal">names</code> array of the previous example.</p><div class="figure"><a id="learnjava3-CHP-4-FIG-4"/><div class="figure-contents"><div class="mediaobject"><a id="I_4_tt204"/><img src="httpatomoreillycomsourceoreillyimages1707616.png" alt="A Java array"/></div></div><p class="title">Figure 4-4. A Java array</p></div><p><code class="literal">names</code> is a variable of type <code class="literal">String[]</code> (i.e., a string array). This particular <code class="literal">String[]</code> object contains four <code class="literal">String</code> type variables. We have assigned <code class="literal">String</code> objects to the first three array elements. The fourth has the default value <code class="literal">null</code>.</p><p>Java supports the C-style curly braces <a id="I_indexterm4_id687590" class="indexterm"/><a id="I_indexterm4_id687598" class="indexterm"/><code class="literal">{}</code> construct for creating an array and initializing its elements:</p><a id="I_4_tt205"/><pre class="programlisting"> <code class="kt">int</code> <code class="o">[]</code> <code class="n">primes</code> <code class="o">=</code> <code class="o">{</code> <code class="mi">2</code><code class="o">,</code> <code class="mi">3</code><code class="o">,</code> <code class="mi">5</code><code class="o">,</code> <code class="mi">7</code><code class="o">,</code> <code class="mi">7</code><code class="o">+</code><code class="mi">4</code> <code class="o">};</code> <code class="c1">// e.g., primes[2] = 5</code></pre><p>An array object of the proper type and length is implicitly created, and the values of the comma-separated list of expressions are assigned to its elements. Note that we did not use the <code class="literal">new</code> keyword or the array type here. The type of the array was inferred from the assignment.</p><p>We can use the <a id="I_indexterm4_id687632" class="indexterm"/><a id="I_indexterm4_id687639" class="indexterm"/><code class="literal">{}</code> syntax with an array of objects. In this case, each expression must evaluate to an object that can be assigned to a variable of the base type of the array or the value <code class="literal">null</code>. Here are some examples:</p><a id="I_4_tt206"/><pre class="programlisting"> <code class="n">String</code> <code class="o">[]</code> <code class="n">verbs</code> <code class="o">=</code> <code class="o">{</code> <code class="s">"run"</code><code class="o">,</code> <code class="s">"jump"</code><code class="o">,</code> <code class="n">someWord</code><code class="o">.</code><code class="na">toString</code><code class="o">()</code> <code class="o">};</code> <code class="n">Button</code> <code class="o">[]</code> <code class="n">controls</code> <code class="o">=</code> <code class="o">{</code> <code class="n">stopButton</code><code class="o">,</code> <code class="k">new</code> <code class="n">Button</code><code class="o">(</code><code class="s">"Forwards"</code><code class="o">),</code> <code class="k">new</code> <code class="nf">Button</code><code class="o">(</code><code class="s">"Backwards"</code><code class="o">)</code> <code class="o">};</code> <code class="c1">// All types are subtypes of Object</code> <code class="n">Object</code> <code class="o">[]</code> <code class="n">objects</code> <code class="o">=</code> <code class="o">{</code> <code class="n">stopButton</code><code class="o">,</code> <code class="s">"A word"</code><code class="o">,</code> <code class="kc">null</code> <code class="o">};</code></pre><p>The following are equivalent:<a id="I_indexterm4_id687672" class="indexterm"/><a id="I_indexterm4_id687679" class="indexterm"/></p><a id="I_4_tt207"/><pre class="programlisting"> <code class="n">Button</code> <code class="o">[]</code> <code class="n">threeButtons</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Button</code> <code class="o">[</code><code class="mi">3</code><code class="o">];</code> <code class="n">Button</code> <code class="o">[]</code> <code class="n">threeButtons</code> <code class="o">=</code> <code class="o">{</code> <code class="kc">null</code><code class="o">,</code> <code class="kc">null</code><code class="o">,</code> <code class="kc">null</code> <code class="o">};</code></pre></div><div class="sect2" title="Using Arrays"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-4-SECT-7.3"/>Using Arrays</h2></div></div></div><p><a id="idx10134" class="indexterm"/> <a id="idx10183" class="indexterm"/>The size of an array object is available in the public variable <code class="literal">length</code>:</p><a id="I_4_tt208"/><pre class="programlisting"> <code class="kt">char</code> <code class="o">[]</code> <code class="n">alphabet</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">char</code> <code class="o">[</code><code class="mi">26</code><code class="o">];</code> <code class="kt">int</code> <code class="n">alphaLen</code> <code class="o">=</code> <code class="n">alphabet</code><code class="o">.</code><code class="na">length</code><code class="o">;</code> <code class="c1">// alphaLen == 26</code> <code class="n">String</code> <code class="o">[]</code> <code class="n">musketeers</code> <code class="o">=</code> <code class="o">{</code> <code class="s">"one"</code><code class="o">,</code> <code class="s">"two"</code><code class="o">,</code> <code class="s">"three"</code> <code class="o">};</code> <code class="kt">int</code> <code class="n">num</code> <code class="o">=</code> <code class="n">musketeers</code><code class="o">.</code><code class="na">length</code><code class="o">;</code> <code class="c1">// num == 3</code></pre><p><a id="I_indexterm4_id687746" class="indexterm"/> <code class="literal">length</code> is the only accessible field of an array; it is a variable, not a method. (Don’t worry; the compiler tells you when you accidentally use parentheses as if it were a method, as everyone does now and then.)</p><p>Array access in Java is just like array access in other languages; you access an element by putting an integer-valued expression between brackets after the name of the array. The following example creates an array of <code class="literal">Button</code> objects called <code class="literal">keyPad</code> and then fills the array with <code class="literal">Button</code> objects:</p><a id="I_4_tt209"/><pre class="programlisting"> <code class="n">Button</code> <code class="o">[]</code> <code class="n">keyPad</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Button</code> <code class="o">[</code> <code class="mi">10</code> <code class="o">];</code> <code class="k">for</code> <code class="o">(</code> <code class="kt">int</code> <code class="n">i</code><code class="o">=</code><code class="mi">0</code><code class="o">;</code> <code class="n">i</code> <code class="o">&lt;</code> <code class="n">keyPad</code><code class="o">.</code><code class="na">length</code><code class="o">;</code> <code class="n">i</code><code class="o">++</code> <code class="o">)</code> <code class="n">keyPad</code><code class="o">[</code> <code class="n">i</code> <code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Button</code><code class="o">(</code> <code class="n">Integer</code><code class="o">.</code><code class="na">toString</code><code class="o">(</code> <code class="n">i</code> <code class="o">)</code> <code class="o">);</code></pre><p>Remember that we can also use the enhanced <code class="literal">for</code> loop to iterate over array values. Here we’ll use it to print all the values we just assigned:</p><a id="I_4_tt210"/><pre class="programlisting"> <code class="k">for</code> <code class="o">(</code><code class="n">Button</code> <code class="n">b</code> <code class="o">:</code> <code class="n">keyPad</code><code class="o">)</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code><code class="n">b</code><code class="o">);</code></pre><p>Attempting to access an element that is outside the range of the array generates an <a id="I_indexterm4_id687815" class="indexterm"/><code class="literal">ArrayIndexOutOfBoundsException</code>. This is a type of <code class="literal">RuntimeException</code>, so you can either catch and handle it yourself if you really expect it, or ignore it, as we’ve already discussed:</p><a id="I_4_tt211"/><pre class="programlisting"> <code class="n">String</code> <code class="o">[]</code> <code class="n">states</code> <code class="o">=</code> <code class="k">new</code> <code class="n">String</code> <code class="o">[</code><code class="mi">50</code><code class="o">];</code> <code class="k">try</code> <code class="o">{</code> <code class="n">states</code><code class="o">[</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="s">"California"</code><code class="o">;</code> <code class="n">states</code><code class="o">[</code><code class="mi">1</code><code class="o">]</code> <code class="o">=</code> <code class="s">"Oregon"</code><code class="o">;</code> <code class="o">...</code> <code class="n">states</code><code class="o">[</code><code class="mi">50</code><code class="o">]</code> <code class="o">=</code> <code class="s">"McDonald's Land"</code><code class="o">;</code> <code class="c1">// Error: array out of bounds</code> <code class="o">}</code> <code class="k">catch</code> <code class="o">(</code> <code class="n">ArrayIndexOutOfBoundsException</code> <code class="n">err</code> <code class="o">)</code> <code class="o">{</code> <code class="n">System</code><code class="o">.</code><code class="na">out</code><code class="o">.</code><code class="na">println</code><code class="o">(</code> <code class="s">"Handled error: "</code> <code class="o">+</code> <code class="n">err</code><code class="o">.</code><code class="na">getMessage</code><code class="o">()</code> <code class="o">);</code> <code class="o">}</code></pre><p>It’s a common task to copy a range of elements from one array into another. One way to copy arrays is to use the low-level <a id="I_indexterm4_id687850" class="indexterm"/><code class="literal">arraycopy()</code> method of the <code class="literal">System</code> class:</p><a id="I_4_tt212"/><pre class="programlisting"> <code class="n">System</code><code class="o">.</code><code class="na">arraycopy</code><code class="o">(</code> <code class="n">source</code><code class="o">,</code> <code class="n">sourceStart</code><code class="o">,</code> <code class="n">destination</code><code class="o">,</code> <code class="n">destStart</code><code class="o">,</code> <code class="n">length</code> <code class="o">);</code></pre><p>The following example doubles the size of the <code class="literal">names</code> array from an earlier example:</p><a id="I_4_tt213"/><pre class="programlisting"> <code class="n">String</code> <code class="o">[]</code> <code class="n">tmpVar</code> <code class="o">=</code> <code class="k">new</code> <code class="n">String</code> <code class="o">[</code> <code class="mi">2</code> <code class="o">*</code> <code class="n">names</code><code class="o">.</code><code class="na">length</code> <code class="o">];</code> <code class="n">System</code><code class="o">.</code><code class="na">arraycopy</code><code class="o">(</code> <code class="n">names</code><code class="o">,</code> <code class="mi">0</code><code class="o">,</code> <code class="n">tmpVar</code><code class="o">,</code> <code class="mi">0</code><code class="o">,</code> <code class="n">names</code><code class="o">.</code><code class="na">length</code> <code class="o">);</code> <code class="n">names</code> <code class="o">=</code> <code class="n">tmpVar</code><code class="o">;</code></pre><p>A new array, twice the size of <code class="literal">names</code>, is allocated and assigned to a temporary variable, <code class="literal">tmpVar</code>. The <code class="literal">arraycopy()</code> method is then used to copy the elements of <code class="literal">names</code> to the new array. Finally, the new array is assigned to <code class="literal">names</code>. If there are no remaining references to the old array object after <code class="literal">names</code> has been copied, it is garbage-collected on the next pass.</p><p>An easier way is to use the <code class="literal">java.util.Arrays</code><a id="I_indexterm4_id687937" class="indexterm"/><code class="literal">copyOf()</code> and <a id="I_indexterm4_id687947" class="indexterm"/><code class="literal">copyOfRange()</code> methods:</p><a id="I_programlisting4_id687958"/><pre class="programlisting"> <code class="kt">byte</code> <code class="o">[]</code> <code class="n">bar</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">byte</code><code class="o">[]</code> <code class="o">{</code> <code class="mi">1</code><code class="o">,</code> <code class="mi">2</code><code class="o">,</code> <code class="mi">3</code><code class="o">,</code> <code class="mi">4</code><code class="o">,</code> <code class="mi">5</code> <code class="o">};</code> <code class="kt">byte</code> <code class="o">[]</code> <code class="n">barCopy</code> <code class="o">=</code> <code class="n">Arrays</code><code class="o">.</code><code class="na">copyOf</code><code class="o">(</code> <code class="n">bar</code><code class="o">,</code> <code class="n">bar</code><code class="o">.</code><code class="na">length</code> <code class="o">);</code> <code class="c1">// { 1, 2, 3, 4, 5 }</code> <code class="kt">byte</code> <code class="o">[]</code> <code class="n">expanded</code> <code class="o">=</code> <code class="n">Arrays</code><code class="o">.</code><code class="na">copyOf</code><code class="o">(</code> <code class="n">bar</code><code class="o">,</code> <code class="n">bar</code><code class="o">.</code><code class="na">length</code><code class="o">+</code><code class="mi">2</code> <code class="o">);</code> <code class="c1">// { 1, 2, 3, 4, 5, 0, 0 }</code> <code class="kt">byte</code> <code class="o">[]</code> <code class="n">firstThree</code> <code class="o">=</code> <code class="n">Arrays</code><code class="o">.</code><code class="na">copyOfRange</code><code class="o">(</code> <code class="n">bar</code><code class="o">,</code> <code class="mi">0</code><code class="o">,</code> <code class="mi">3</code> <code class="o">);</code> <code class="c1">// { 1, 2, 3 }</code> <code class="kt">byte</code> <code class="o">[]</code> <code class="n">lastThree</code> <code class="o">=</code> <code class="n">Arrays</code><code class="o">.</code><code class="na">copyOfRange</code><code class="o">(</code> <code class="n">bar</code><code class="o">,</code> <code class="mi">2</code><code class="o">,</code> <code class="n">bar</code><code class="o">.</code><code class="na">length</code> <code class="o">);</code> <code class="c1">// { 3, 4, 5 }</code> <code class="kt">byte</code> <code class="o">[]</code> <code class="n">lastThreePlusTwo</code> <code class="o">=</code> <code class="n">Arrays</code><code class="o">.</code><code class="na">copyOfRange</code><code class="o">(</code> <code class="n">bar</code><code class="o">,</code> <code class="mi">2</code><code class="o">,</code> <code class="n">bar</code><code class="o">.</code><code class="na">length</code><code class="o">+</code><code class="mi">2</code> <code class="o">);</code> <code class="c1">// { 3, 4, 5, 0, 0 }</code></pre><p>The <code class="literal">copyOf()</code> method takes the original array and a target length. If the target length is larger than the original array length, then the new array is padded (with zeros or nulls) to the desired length. The <code class="literal">copyOfRange()</code> takes a starting index (inclusive) and an ending index (exclusive) and a desired length, which will also be padded if necessary.<a id="I_indexterm4_id687984" class="indexterm"/><a id="I_indexterm4_id687992" class="indexterm"/></p></div><div class="sect2" title="Anonymous Arrays"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-4-SECT-7.4"/>Anonymous Arrays</h2></div></div></div><p><a id="I_indexterm4_id688006" class="indexterm"/> <a id="idx10131" class="indexterm"/> <a id="I_indexterm4_id688024" class="indexterm"/>Often it is convenient to create “throwaway” arrays, arrays that are used in one place and never referenced anywhere else. Such arrays don’t need a name because you never need to refer to them again in that context. For example, you may want to create a collection of objects to pass as an argument to some method. It’s easy enough to create a normal, named array, but if you don’t actually work with the array (if you use the array only as a holder for some collection), you shouldn’t need to do this. Java makes it easy to create “anonymous” (i.e., unnamed) arrays.</p><p>Let’s say you need to call a method named <code class="literal">setPets()</code>, which takes an array of <code class="literal">Animal</code> objects as arguments. Provided <code class="literal">Cat</code> and <code class="literal">Dog</code> are subclasses of <code class="literal">Animal</code>, here’s how to call <code class="literal">setPets()</code> using an anonymous array:</p><a id="I_4_tt214"/><pre class="programlisting"> <code class="n">Dog</code> <code class="n">pokey</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Dog</code> <code class="o">(</code><code class="s">"gray"</code><code class="o">);</code> <code class="n">Cat</code> <code class="n">boojum</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Cat</code> <code class="o">(</code><code class="s">"grey"</code><code class="o">);</code> <code class="n">Cat</code> <code class="n">simon</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Cat</code> <code class="o">(</code><code class="s">"orange"</code><code class="o">);</code> <code class="n">setPets</code> <code class="o">(</code> <code class="k">new</code> <code class="n">Animal</code> <code class="o">[]</code> <code class="o">{</code> <code class="n">pokey</code><code class="o">,</code> <code class="n">boojum</code><code class="o">,</code> <code class="n">simon</code> <code class="o">});</code></pre><p>The syntax looks similar to the initialization of an array in a variable declaration. We implicitly define the size of the array and fill in its elements using the curly-brace notation. However, because this is not a variable declaration, we have to explicitly use the <code class="literal">new</code> operator and the array type to create the array object.</p><p>Anonymous arrays were sometimes used as a substitute for variable-length argument lists to methods, which are discussed in <a class="xref" href="ch05.html" title="Chapter 5. Objects in Java">Chapter 5</a>. With the introduction of variable-length argument lists in Java, the usefulness of anonymous arrays has diminished.</p></div><div class="sect2" title="Multidimensional Arrays"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-4-SECT-7.5"/>Multidimensional Arrays</h2></div></div></div><p><a id="idx10133" class="indexterm"/> <a id="idx10166" class="indexterm"/> <a id="idx10181" class="indexterm"/>Java supports multidimensional arrays in the form of arrays of array type objects. You create a multidimensional array with C-like syntax, using multiple bracket pairs, one for each dimension. You also use this syntax to access elements at various positions within the array. Here’s an example of a multidimensional array that represents a chess board:</p><a id="I_4_tt215"/><pre class="programlisting"> <code class="n">ChessPiece</code> <code class="o">[][]</code> <code class="n">chessBoard</code><code class="o">;</code> <code class="n">chessBoard</code> <code class="o">=</code> <code class="k">new</code> <code class="n">ChessPiece</code> <code class="o">[</code><code class="mi">8</code><code class="o">][</code><code class="mi">8</code><code class="o">];</code> <code class="n">chessBoard</code><code class="o">[</code><code class="mi">0</code><code class="o">][</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="n">ChessPiece</code><code class="o">.</code><code class="na">Rook</code><code class="o">;</code> <code class="n">chessBoard</code><code class="o">[</code><code class="mi">1</code><code class="o">][</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="n">ChessPiece</code><code class="o">.</code><code class="na">Pawn</code><code class="o">;</code> <code class="o">...</code></pre><p>Here, <code class="literal">chessBoard</code> is declared as a variable of type <code class="literal">ChessPiece[][]</code> (i.e., an array of <code class="literal">ChessPiece</code> arrays). This declaration implicitly creates the type <code class="literal">ChessPiece[]</code> as well. The example illustrates the special form of the <code class="literal">new</code> operator used to create a multidimensional array. It creates an array of <code class="literal">ChessPiece[]</code> objects and then, in turn, makes each element into an array of <code class="literal">ChessPiece</code> objects. We then index <code class="literal">chessBoard</code> to specify values for particular <code class="literal">ChessPiece</code> elements. (We’ll neglect the color of the pieces here.)</p><p>Of course, you can create arrays with more than two dimensions. Here’s a slightly impractical example:</p><a id="I_4_tt216"/><pre class="programlisting"> <code class="n">Color</code> <code class="o">[][][]</code> <code class="n">rgbCube</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Color</code> <code class="o">[</code><code class="mi">256</code><code class="o">][</code><code class="mi">256</code><code class="o">][</code><code class="mi">256</code><code class="o">];</code> <code class="n">rgbCube</code><code class="o">[</code><code class="mi">0</code><code class="o">][</code><code class="mi">0</code><code class="o">][</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="n">Color</code><code class="o">.</code><code class="na">black</code><code class="o">;</code> <code class="n">rgbCube</code><code class="o">[</code><code class="mi">255</code><code class="o">][</code><code class="mi">255</code><code class="o">][</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="n">Color</code><code class="o">.</code><code class="na">yellow</code><code class="o">;</code> <code class="o">...</code></pre><p>We can specify a partial index of a multidimensional array to get a subarray of array type objects with fewer dimensions. In our example, the variable <code class="literal">chessBoard</code> is of type <code class="literal">ChessPiece[][]</code>. The expression <code class="literal">chessBoard[0]</code> is valid and refers to the first element of <code class="literal">chessBoard</code>, which, in Java, is of type <code class="literal">ChessPiece[]</code>. For example, we can populate our chess board one row at a time:</p><a id="I_4_tt217"/><pre class="programlisting"> <code class="n">ChessPiece</code> <code class="o">[]</code> <code class="n">homeRow</code> <code class="o">=</code> <code class="o">{</code> <code class="k">new</code> <code class="nf">ChessPiece</code><code class="o">(</code><code class="s">"Rook"</code><code class="o">),</code> <code class="k">new</code> <code class="n">ChessPiece</code><code class="o">(</code><code class="s">"Knight"</code><code class="o">),</code> <code class="k">new</code> <code class="nf">ChessPiece</code><code class="o">(</code><code class="s">"Bishop"</code><code class="o">),</code> <code class="k">new</code> <code class="n">ChessPiece</code><code class="o">(</code><code class="s">"King"</code><code class="o">),</code> <code class="k">new</code> <code class="nf">ChessPiece</code><code class="o">(</code><code class="s">"Queen"</code><code class="o">),</code> <code class="k">new</code> <code class="n">ChessPiece</code><code class="o">(</code><code class="s">"Bishop"</code><code class="o">),</code> <code class="k">new</code> <code class="nf">ChessPiece</code><code class="o">(</code><code class="s">"Knight"</code><code class="o">),</code> <code class="k">new</code> <code class="n">ChessPiece</code><code class="o">(</code><code class="s">"Rook"</code><code class="o">)</code> <code class="o">};</code> <code class="n">chessBoard</code><code class="o">[</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="n">homeRow</code><code class="o">;</code></pre><p>We don’t necessarily have to specify the dimension sizes of a multidimensional array with a single <a id="I_indexterm4_id688293" class="indexterm"/><code class="literal">new</code> operation. The syntax of the <code class="literal">new</code> operator lets us leave the sizes of some dimensions unspecified. The size of at least the first dimension (the most significant dimension of the array) has to be specified, but the sizes of any number of trailing, less significant array dimensions may be left undefined. We can assign appropriate array-type values later.</p><p>We can create a checkerboard of Boolean values (which is not quite sufficient for a real game of checkers either) using this technique:</p><a id="I_4_tt218"/><pre class="programlisting"> <code class="kt">boolean</code> <code class="o">[][]</code> <code class="n">checkerBoard</code><code class="o">;</code> <code class="n">checkerBoard</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">boolean</code> <code class="o">[</code><code class="mi">8</code><code class="o">][];</code></pre><p>Here, <code class="literal">checkerBoard</code> is declared and created, but its elements, the eight <code class="literal">boolean[]</code> objects of the next level, are left empty. Thus, for example, <code class="literal">checkerBoard[0]</code> is <code class="literal">null</code> until we explicitly create an array and assign it, as follows:</p><a id="I_4_tt219"/><pre class="programlisting"> <code class="n">checkerBoard</code><code class="o">[</code><code class="mi">0</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">boolean</code> <code class="o">[</code><code class="mi">8</code><code class="o">];</code> <code class="n">checkerBoard</code><code class="o">[</code><code class="mi">1</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">boolean</code> <code class="o">[</code><code class="mi">8</code><code class="o">];</code> <code class="o">...</code> <code class="n">checkerBoard</code><code class="o">[</code><code class="mi">7</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">boolean</code> <code class="o">[</code><code class="mi">8</code><code class="o">];</code></pre><p>The code of the previous two examples is equivalent to:</p><a id="I_4_tt220"/><pre class="programlisting"> <code class="kt">boolean</code> <code class="o">[][]</code> <code class="n">checkerBoard</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">boolean</code> <code class="o">[</code><code class="mi">8</code><code class="o">][</code><code class="mi">8</code><code class="o">];</code></pre><p>One reason we might want to leave dimensions of an array unspecified is so that we can store arrays given to us by another method.</p><p>Note that because the length of the array is not part of its type, the arrays in the checkerboard do not necessarily have to be of the same length; that is, multidimensional arrays don’t have to be rectangular. Here’s a defective (but perfectly legal in Java) checkerboard:</p><a id="I_4_tt221"/><pre class="programlisting"> <code class="n">checkerBoard</code><code class="o">[</code><code class="mi">2</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">boolean</code> <code class="o">[</code><code class="mi">3</code><code class="o">];</code> <code class="n">checkerBoard</code><code class="o">[</code><code class="mi">3</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">boolean</code> <code class="o">[</code><code class="mi">10</code><code class="o">];</code></pre><p>And here’s how you could create and initialize a triangular array:<a id="I_indexterm4_id688401" class="indexterm"/><a id="I_indexterm4_id688408" class="indexterm"/><a id="I_indexterm4_id688416" class="indexterm"/></p><a id="I_4_tt222"/><pre class="programlisting"> <code class="kt">int</code> <code class="o">[][]</code> <code class="n">triangle</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">int</code> <code class="o">[</code><code class="mi">5</code><code class="o">][];</code> <code class="k">for</code> <code class="o">(</code><code class="kt">int</code> <code class="n">i</code> <code class="o">=</code> <code class="mi">0</code><code class="o">;</code> <code class="n">i</code> <code class="o">&lt;</code> <code class="n">triangle</code><code class="o">.</code><code class="na">length</code><code class="o">;</code> <code class="n">i</code><code class="o">++)</code> <code class="o">{</code> <code class="n">triangle</code><code class="o">[</code><code class="n">i</code><code class="o">]</code> <code class="o">=</code> <code class="k">new</code> <code class="kt">int</code> <code class="o">[</code><code class="n">i</code> <code class="o">+</code> <code class="mi">1</code><code class="o">];</code> <code class="k">for</code> <code class="o">(</code><code class="kt">int</code> <code class="n">j</code> <code class="o">=</code> <code class="mi">0</code><code class="o">;</code> <code class="n">j</code> <code class="o">&lt;</code> <code class="n">i</code> <code class="o">+</code> <code class="mi">1</code><code class="o">;</code> <code class="n">j</code><code class="o">++)</code> <code class="n">triangle</code><code class="o">[</code><code class="n">i</code><code class="o">][</code><code class="n">j</code><code class="o">]</code> <code class="o">=</code> <code class="n">i</code> <code class="o">+</code> <code class="n">j</code><code class="o">;</code> <code class="o">}</code></pre></div><div class="sect2" title="Inside Arrays"><div class="titlepage"><div><div><h2 class="title"><a id="learnjava3-CHP-4-SECT-7.6"/>Inside Arrays</h2></div></div></div><p>We said earlier that arrays are instances of special array classes in the Java language. If arrays have classes, where do they fit into the class hierarchy and how are they related? These are good questions, but we need to talk more about the object-oriented aspects of Java before answering them. That’s the subject of the next chapter. For now, take it on faith that arrays fit into the class hierarchy.</p></div><div class="footnotes"><br/><hr/><div class="footnote"><p><sup>[<a id="ftn.learnjava3-CHP-4-FNOTE-5" href="#learnjava3-CHP-4-FNOTE-5" class="para">11</a>] </sup>The analog in C or C++ is an array of pointers to objects. However, pointers in C or C++ are themselves two- or four-byte values. Allocating an array of pointers is, in actuality, allocating the storage for some number of those pointer objects. An array of references is conceptually similar, although references are not themselves objects. We can’t manipulate references or parts of references other than by assignment, and their storage requirements (or lack thereof) are not part of the high-level Java language specification.</p></div></div></div></body></html>