Merge from the pain train
[official-gcc.git] / libjava / java / util / List.java
blob6d3df8593be454ea063054ccd997de9fa62e023b
1 /* List.java -- An ordered collection which allows indexed access
2 Copyright (C) 1998, 2001, 2005 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA.
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package java.util;
41 /**
42 * An ordered collection (also known as a list). This collection allows
43 * access to elements by position, as well as control on where elements
44 * are inserted. Unlike sets, duplicate elements are permitted by this
45 * general contract (if a subclass forbids duplicates, this should be
46 * documented).
47 * <p>
49 * List places additional requirements on <code>iterator</code>,
50 * <code>add</code>, <code>remove</code>, <code>equals</code>, and
51 * <code>hashCode</code>, in addition to requiring more methods. List
52 * indexing is 0-based (like arrays), although some implementations may
53 * require time proportional to the index to obtain an arbitrary element.
54 * The List interface is incompatible with Set; you cannot implement both
55 * simultaneously.
56 * <p>
58 * Lists also provide a <code>ListIterator</code> which allows bidirectional
59 * traversal and other features atop regular iterators. Lists can be
60 * searched for arbitrary elements, and allow easy insertion and removal
61 * of multiple elements in one method call.
62 * <p>
64 * Note: While lists may contain themselves as elements, this leads to
65 * undefined (usually infinite recursive) behavior for some methods like
66 * hashCode or equals.
68 * @author Original author unknown
69 * @author Eric Blake (ebb9@email.byu.edu)
70 * @see Collection
71 * @see Set
72 * @see ArrayList
73 * @see LinkedList
74 * @see Vector
75 * @see Arrays#asList(Object[])
76 * @see Collections#nCopies(int, Object)
77 * @see Collections#EMPTY_LIST
78 * @see AbstractList
79 * @see AbstractSequentialList
80 * @since 1.2
81 * @status updated to 1.4
83 public interface List extends Collection
85 /**
86 * Insert an element into the list at a given position (optional operation).
87 * This shifts all existing elements from that position to the end one
88 * index to the right. This version of add has no return, since it is
89 * assumed to always succeed if there is no exception.
91 * @param index the location to insert the item
92 * @param o the object to insert
93 * @throws UnsupportedOperationException if this list does not support the
94 * add operation
95 * @throws IndexOutOfBoundsException if index &lt; 0 || index &gt; size()
96 * @throws ClassCastException if o cannot be added to this list due to its
97 * type
98 * @throws IllegalArgumentException if o cannot be added to this list for
99 * some other reason
100 * @throws NullPointerException if o is null and this list doesn't support
101 * the addition of null values.
103 void add(int index, Object o);
106 * Add an element to the end of the list (optional operation). If the list
107 * imposes restraints on what can be inserted, such as no null elements,
108 * this should be documented.
110 * @param o the object to add
111 * @return true, as defined by Collection for a modified list
112 * @throws UnsupportedOperationException if this list does not support the
113 * add operation
114 * @throws ClassCastException if o cannot be added to this list due to its
115 * type
116 * @throws IllegalArgumentException if o cannot be added to this list for
117 * some other reason
118 * @throws NullPointerException if o is null and this list doesn't support
119 * the addition of null values.
121 boolean add(Object o);
124 * Insert the contents of a collection into the list at a given position
125 * (optional operation). Shift all elements at that position to the right
126 * by the number of elements inserted. This operation is undefined if
127 * this list is modified during the operation (for example, if you try
128 * to insert a list into itself).
130 * @param index the location to insert the collection
131 * @param c the collection to insert
132 * @return true if the list was modified by this action, that is, if c is
133 * non-empty
134 * @throws UnsupportedOperationException if this list does not support the
135 * addAll operation
136 * @throws IndexOutOfBoundsException if index &lt; 0 || index &gt; size()
137 * @throws ClassCastException if some element of c cannot be added to this
138 * list due to its type
139 * @throws IllegalArgumentException if some element of c cannot be added
140 * to this list for some other reason
141 * @throws NullPointerException if some element of c is null and this list
142 * doesn't support the addition of null values.
143 * @throws NullPointerException if the specified collection is null
144 * @see #add(int, Object)
146 boolean addAll(int index, Collection c);
149 * Add the contents of a collection to the end of the list (optional
150 * operation). This operation is undefined if this list is modified
151 * during the operation (for example, if you try to insert a list into
152 * itself).
154 * @param c the collection to add
155 * @return true if the list was modified by this action, that is, if c is
156 * non-empty
157 * @throws UnsupportedOperationException if this list does not support the
158 * addAll operation
159 * @throws ClassCastException if some element of c cannot be added to this
160 * list due to its type
161 * @throws IllegalArgumentException if some element of c cannot be added
162 * to this list for some other reason
163 * @throws NullPointerException if the specified collection is null
164 * @throws NullPointerException if some element of c is null and this list
165 * doesn't support the addition of null values.
166 * @see #add(Object)
168 boolean addAll(Collection c);
171 * Clear the list, such that a subsequent call to isEmpty() would return
172 * true (optional operation).
174 * @throws UnsupportedOperationException if this list does not support the
175 * clear operation
177 void clear();
180 * Test whether this list contains a given object as one of its elements.
181 * This is defined as the existence of an element e such that
182 * <code>o == null ? e == null : o.equals(e)</code>.
184 * @param o the element to look for
185 * @return true if this list contains the element
186 * @throws ClassCastException if the type of o is not a valid type
187 * for this list.
188 * @throws NullPointerException if o is null and the list doesn't
189 * support null values.
191 boolean contains(Object o);
194 * Test whether this list contains every element in a given collection.
196 * @param c the collection to test for
197 * @return true if for every element o in c, contains(o) would return true
198 * @throws NullPointerException if the collection is null
199 * @throws ClassCastException if the type of any element in c is not a valid
200 * type for this list.
201 * @throws NullPointerException if some element of c is null and this
202 * list does not support null values.
203 * @see #contains(Object)
205 boolean containsAll(Collection c);
208 * Test whether this list is equal to another object. A List is defined to be
209 * equal to an object if and only if that object is also a List, and the two
210 * lists have the same sequence. Two lists l1 and l2 are equal if and only
211 * if <code>l1.size() == l2.size()</code>, and for every integer n between 0
212 * and <code>l1.size() - 1</code> inclusive, <code>l1.get(n) == null ?
213 * l2.get(n) == null : l1.get(n).equals(l2.get(n))</code>.
215 * @param o the object to test for equality with this list
216 * @return true if o is equal to this list
217 * @see Object#equals(Object)
218 * @see #hashCode()
220 boolean equals(Object o);
223 * Get the element at a given index in this list.
225 * @param index the index of the element to be returned
226 * @return the element at index index in this list
227 * @throws IndexOutOfBoundsException if index &lt; 0 || index &gt;= size()
229 Object get(int index);
232 * Obtains a hash code for this list. In order to obey the general
233 * contract of the hashCode method of class Object, this value is
234 * calculated as follows:
236 <p><pre>hashCode = 1;
237 Iterator i = list.iterator();
238 while (i.hasNext())
240 Object obj = i.next();
241 hashCode = 31 * hashCode + (obj == null ? 0 : obj.hashCode());
242 }</pre>
244 * <p>This ensures that the general contract of Object.hashCode()
245 * is adhered to.
247 * @return the hash code of this list
248 * @see Object#hashCode()
249 * @see #equals(Object)
251 int hashCode();
254 * Obtain the first index at which a given object is to be found in this
255 * list.
257 * @param o the object to search for
258 * @return the least integer n such that <code>o == null ? get(n) == null :
259 * o.equals(get(n))</code>, or -1 if there is no such index.
260 * @throws ClassCastException if the type of o is not a valid
261 * type for this list.
262 * @throws NullPointerException if o is null and this
263 * list does not support null values.
265 int indexOf(Object o);
268 * Test whether this list is empty, that is, if size() == 0.
270 * @return true if this list contains no elements
272 boolean isEmpty();
275 * Obtain an Iterator over this list, whose sequence is the list order.
277 * @return an Iterator over the elements of this list, in order
279 Iterator iterator();
282 * Obtain the last index at which a given object is to be found in this
283 * list.
285 * @return the greatest integer n such that <code>o == null ? get(n) == null
286 * : o.equals(get(n))</code>, or -1 if there is no such index.
287 * @throws ClassCastException if the type of o is not a valid
288 * type for this list.
289 * @throws NullPointerException if o is null and this
290 * list does not support null values.
292 int lastIndexOf(Object o);
295 * Obtain a ListIterator over this list, starting at the beginning.
297 * @return a ListIterator over the elements of this list, in order, starting
298 * at the beginning
300 ListIterator listIterator();
303 * Obtain a ListIterator over this list, starting at a given position.
304 * A first call to next() would return the same as get(index), and a
305 * first call to previous() would return the same as get(index - 1).
307 * @param index the position, between 0 and size() inclusive, to begin the
308 * iteration from
309 * @return a ListIterator over the elements of this list, in order, starting
310 * at index
311 * @throws IndexOutOfBoundsException if index &lt; 0 || index &gt; size()
313 ListIterator listIterator(int index);
316 * Remove the element at a given position in this list (optional operation).
317 * Shifts all remaining elements to the left to fill the gap.
319 * @param index the position within the list of the object to remove
320 * @return the object that was removed
321 * @throws UnsupportedOperationException if this list does not support the
322 * remove operation
323 * @throws IndexOutOfBoundsException if index &lt; 0 || index &gt;= size()
325 Object remove(int index);
328 * Remove the first occurence of an object from this list (optional
329 * operation). That is, remove the first element e such that
330 * <code>o == null ? e == null : o.equals(e)</code>.
332 * @param o the object to remove
333 * @return true if the list changed as a result of this call, that is, if
334 * the list contained at least one occurrence of o
335 * @throws UnsupportedOperationException if this list does not support the
336 * remove operation
337 * @throws ClassCastException if the type of o is not a valid
338 * type for this list.
339 * @throws NullPointerException if o is null and this
340 * list does not support removing null values.
342 boolean remove(Object o);
345 * Remove all elements of a given collection from this list (optional
346 * operation). That is, remove every element e such that c.contains(e).
348 * @param c the collection to filter out
349 * @return true if this list was modified as a result of this call
350 * @throws UnsupportedOperationException if this list does not support the
351 * removeAll operation
352 * @throws NullPointerException if the collection is null
353 * @throws ClassCastException if the type of any element in c is not a valid
354 * type for this list.
355 * @throws NullPointerException if some element of c is null and this
356 * list does not support removing null values.
357 * @see #remove(Object)
358 * @see #contains(Object)
360 boolean removeAll(Collection c);
363 * Remove all elements of this list that are not contained in a given
364 * collection (optional operation). That is, remove every element e such
365 * that !c.contains(e).
367 * @param c the collection to retain
368 * @return true if this list was modified as a result of this call
369 * @throws UnsupportedOperationException if this list does not support the
370 * retainAll operation
371 * @throws NullPointerException if the collection is null
372 * @throws ClassCastException if the type of any element in c is not a valid
373 * type for this list.
374 * @throws NullPointerException if some element of c is null and this
375 * list does not support retaining null values.
376 * @see #remove(Object)
377 * @see #contains(Object)
379 boolean retainAll(Collection c);
382 * Replace an element of this list with another object (optional operation).
384 * @param index the position within this list of the element to be replaced
385 * @param o the object to replace it with
386 * @return the object that was replaced
387 * @throws UnsupportedOperationException if this list does not support the
388 * set operation
389 * @throws IndexOutOfBoundsException if index &lt; 0 || index &gt;= size()
390 * @throws ClassCastException if o cannot be added to this list due to its
391 * type
392 * @throws IllegalArgumentException if o cannot be added to this list for
393 * some other reason
394 * @throws NullPointerException if o is null and this
395 * list does not support null values.
397 Object set(int index, Object o);
400 * Get the number of elements in this list. If the list contains more
401 * than Integer.MAX_VALUE elements, return Integer.MAX_VALUE.
403 * @return the number of elements in the list
405 int size();
408 * Obtain a List view of a subsection of this list, from fromIndex
409 * (inclusive) to toIndex (exclusive). If the two indices are equal, the
410 * sublist is empty. The returned list should be modifiable if and only
411 * if this list is modifiable. Changes to the returned list should be
412 * reflected in this list. If this list is structurally modified in
413 * any way other than through the returned list, the result of any subsequent
414 * operations on the returned list is undefined.
416 * @param fromIndex the index that the returned list should start from
417 * (inclusive)
418 * @param toIndex the index that the returned list should go to (exclusive)
419 * @return a List backed by a subsection of this list
420 * @throws IndexOutOfBoundsException if fromIndex &lt; 0
421 * || toIndex &gt; size() || fromIndex &gt; toIndex
423 List subList(int fromIndex, int toIndex);
426 * Copy the current contents of this list into an array.
428 * @return an array of type Object[] and length equal to the length of this
429 * list, containing the elements currently in this list, in order
431 Object[] toArray();
434 * Copy the current contents of this list into an array. If the array passed
435 * as an argument has length less than that of this list, an array of the
436 * same run-time type as a, and length equal to the length of this list, is
437 * allocated using Reflection. Otherwise, a itself is used. The elements of
438 * this list are copied into it, and if there is space in the array, the
439 * following element is set to null. The resultant array is returned.
440 * Note: The fact that the following element is set to null is only useful
441 * if it is known that this list does not contain any null elements.
443 * @param a the array to copy this list into
444 * @return an array containing the elements currently in this list, in
445 * order
446 * @throws ArrayStoreException if the type of any element of the
447 * collection is not a subtype of the element type of a
448 * @throws NullPointerException if the specified array is null
450 Object[] toArray(Object[] a);