1、继承的类以及实现的接口: 继承自:AbstractList 实现了:List,RandomAccess,Cloneable,java.io.Serializable; 定义的成员变量: transient Object[] elementData; 是一个数组缓冲区,从下面可以看到所有的操作似乎都与之有关。(transient 表示其不可序列化) size: The size of the ArrayList (the number of elements it contains). 我们可以在创建ArrayList的时候指定其大小,相应的其实是实例化了前面提到的对象Object类型的数组。 public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } 但如果我们没有指定其大小的话,他就会默认创建一个容量为10的数组。 public ArrayList() { this(10); } /** * Constructs a list containing the elements of the specified * collection, in the order they are returned by the collection's * iterator. * @param c the collection whose elements are to be placed into this list * @throws NullPointerException if the specified collection is null */ public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); } 上面的这个构造方法允许你传入一个Collection或者其子类。 仔细看他的处理,首先将这个传进来的Collection转换成数组,并指向ArrayList中定义的Object类型的数组。然后获取其长度; 注:6260652 public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength); System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); return copy; } /** * Trims the capacity of this <tt>ArrayList</tt> instance to be the * list's current size. An application can use this operation to minimize * the storage of an <tt>ArrayList</tt> instance. */ public void trimToSize() { modCount++; int oldCapacity = elementData.length; if (size < oldCapacity) { elementData = Arrays.copyOf(elementData, size); } } 注:modCount是其父类AbstractList中的一个成员变量, 其代表的含义是: The number of times this list has been structurally modified, Structural modifications are those that change the size of the list, or otherwise perturb it in such a fashion that iterations in progress may yield incorrect results. 该方法的作用是修整此ArrayList实例的是列表的当前大小的容量。应用程序可以使用此操作,以尽量减少一个ArrayList实例的存储。 /** * Increases the capacity of this <tt>ArrayList</tt> instance, if necessary, to ensure that it can hold at least the * number of elements specified by the minimum capacity argument. * @param minCapacity the desired minimum capacity */ public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3) / 2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } } 这个方法可以实现手动扩大容量,如果你申请的容量大于原来容量的1.5倍+1,那么就使用你申请的容量大小作为之后的List的容量。 return true if this list contains no elements. public boolean isEmpty() { return size == 0; } /** * Returns <tt>true</tt> if this list contains the specified element. More formally, returns <tt>true</tt> if and * only if this list contains at least one element <tt>e</tt> such that * <tt>(o==null ? e==null : o.equals(e))</tt>. */ public boolean contains(Object o) { return indexOf(o) >= 0; } /** * Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not * contain the element. More formally, returns the lowest index <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, or -1 if there is no such index. */ public int indexOf(Object o) { if (o == null) { for (int i = 0; i < size; i++) if (elementData[i] == null) return i; } else { for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } return -1; } 他会遍历List中的元素,然后将每个元素都与源元素比较,如果相同,就返回这个元素的下标。否则返回-1; /** * Returns the index of the last occurrence of the specified element in this list, or -1 if this list does not * contain the element. More formally, returns the highest index <tt>i</tt> such that * <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt>, or -1 if there is no such index. */ public int lastIndexOf(Object o) { if (o == null) { for (int i = size - 1; i >= 0; i--) if (elementData[i] == null) return i; } else { for (int i = size - 1; i >= 0; i--) if (o.equals(elementData[i])) return i; } return -1; } 从最后一个元素遍历,逐个比较,如果相等,则返回元素的下标,否则返回-1; /** * Returns a shallow copy of this <tt>ArrayList</tt> instance. (The elements themselves are not copied.) * * @return a clone of this <tt>ArrayList</tt> instance */ public Object clone() { try { ArrayList<E> v = (ArrayList<E>) super.clone(); v.elementData = Arrays.copyOf(elementData, size); v.modCount = 0; return v; } catch (CloneNotSupportedException e) { // this shouldn't happen, since we are Cloneable throw new InternalError(); } } 加粗标红的那个语句表名,在进行克隆的时候会将所有的元素都拷贝过去,两个对象各自独立,不会相互影响。注意和使用"="进行传值的方式的区别,使用"="传递的是对象的引用,他们指向同一块内存地址,即指向同一个对象,因此他们修改的也是同一个对象。 ArrayList<String> list = new ArrayList<String>(5); list.add("welcome"); list.add("to"); list.add("Java"); @SuppressWarnings("unchecked") ArrayList<String> listCopy = (ArrayList<String>) list.clone(); listCopy.add("world"); System.out.println(list.toString()); System.out.println(listCopy.toString()); ArrayList<String> listCopy2 = list; listCopy2.add("Hello"); System.out.println(list.toString()); System.out.println(listCopy2.toString()); 输出结果: [welcome, to, Java] [welcome, to, Java, world] [welcome, to, Java, Hello] [welcome, to, Java, Hello] /** * Returns an array containing all of the elements in this list in proper sequence (from first to last element). * <p> * The returned array will be "safe" in that no references to it are maintained by this list. (In other words, this * method must allocate a new array). The caller is thus free to modify the returned array. * <p> * This method acts as bridge between array-based and collection-based APIs. * * @return an array containing all of the elements in this list in proper sequence */ public Object[] toArray() { return Arrays.copyOf(elementData, size); } 注:请看下面一段代码: List<String> list = new ArrayList<String>(); // ...省略添加元素的细节 // 意将list转换为数组 String[] str = list.toArray();// 会报类型不匹配的错误 String[] str = (String[]) list.toArray();// 会报ClassCastException异常 主要是因为上面这个方法返回的是一个Object类型的一个数组,就像数组的初始化一样,必须一个一个的赋值,而不能将整个数组转换为另外一种类型。 下面这个方法为上面的问题提供了解决方案: 可以改为: String[] str = (String[]) list.toArray(new String[list.size()]); /** * Returns an array containing all of the elements in this list in proper sequence (from first to last element); the * runtime type of the returned array is that of the specified array. If the list fits in the specified array, it is * returned therein. Otherwise, a new array is allocated with the runtime type of the specified array and the size * of this list. * <p> * If the list fits in the specified array with room to spare (i.e., the array has more elements than the list), the * element in the array immediately following the end of the collection is set to <tt>null</tt>. (This is useful in * determining the length of the list <i>only</i> if the caller knows that the list does not contain any null * elements.) * * @param a the array into which the elements of the list are to be stored, if it is big enough; otherwise, a new * array of the same runtime type is allocated for this purpose. * @return an array containing the elements of the list * @throws ArrayStoreException if the runtime type of the specified array is not a supertype of the runtime type of * every element in this list * @throws NullPointerException if the specified array is null */ public <T> T[] toArray(T[] a) { if (a.length < size) // Make a new array of a's runtime type, but my contents: return (T[]) Arrays.copyOf(elementData, size, a.getClass()); System.arraycopy(elementData, 0, a, 0, size); if (a.length > size) a[size] = null;【疑问:为何此处还要置null?】 return a; } /** * Appends the specified element to the end of this list. * @return <tt>true</tt> (as specified by {@link Collection#add}) */ public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } 如果只是普通的增加一个元素,则会直接增加到下一个元素的位置。但是如果想是替换某个位置的元素,则需要指定要替换元素的位置,并给出待替换值,下面是这个功能的实现: /** * Inserts the specified element at the specified position in this list. Shifts the element currently at that * position (if any) and any subsequent elements to the right (adds one to their indices). * * @param index index at which the specified element is to be inserted * @param element element to be inserted */ public void add(int index, E element) { if (index > size || index < 0) throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); ensureCapacity(size + 1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; } 下面这个方法可以指定待移除的元素的位置。 /** * Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts * one from their indices). * * @param index the index of the element to be removed * @return the element that was removed from the list * @throws IndexOutOfBoundsException {@inheritDoc} */ public E remove(int index) { RangeCheck(index); modCount++; E oldValue = (E) elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index + 1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work return oldValue; } /** * Removes the first occurrence of the specified element from this list, if it is present. If the list does not * contain the element, it is unchanged. More formally, removes the element with the lowest index <tt>i</tt> such * that <tt>(o==null ? get(i)==null : o.equals(get(i)))</tt> (if such an element exists). * Returns <tt>true</tt> if this list contained the specified element (or equivalently, if this list changed as a * result of the call). * * @param o element to be removed from this list, if present * @return <tt>true</tt> if this list contained the specified element */ public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; } /* * Private remove method that skips bounds checking and does not return the value removed. */ private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index + 1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work } /** * Removes all of the elements from this list. The list will be empty after this call returns. */ public void clear() { modCount++; // Let gc do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; } /** * Appends all of the elements in the specified collection to the end of this list, in the order that they are * returned by the specified collection's Iterator. The behavior of this operation is undefined if the specified * collection is modified while the operation is in progress. (This implies that the behavior of this call is * undefined if the specified collection is this list, and this list is nonempty.) * * @param c collection containing elements to be added to this list * @return <tt>true</tt> if this list changed as a result of the call * @throws NullPointerException if the specified collection is null */ public boolean addAll(Collection<? extends E> c) { Object[] a = c.toArray(); int numNew = a.length; ensureCapacity(size + numNew); // Increments modCount System.arraycopy(a, 0, elementData, size, numNew); size += numNew; return numNew != 0; } /** * Inserts all of the elements in the specified collection into this list, starting at the specified position. * Shifts the element currently at that position (if any) and any subsequent elements to the right (increases their * indices). The new elements will appear in the list in the order that they are returned by the specified * collection's iterator. * * @param index index at which to insert the first element from the specified collection * @param c collection containing elements to be added to this list * @return <tt>true</tt> if this list changed as a result of the call * @throws IndexOutOfBoundsException {@inheritDoc} * @throws NullPointerException if the specified collection is null */ public boolean addAll(int index, Collection<? extends E> c) { if (index > size || index < 0) throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); Object[] a = c.toArray(); int numNew = a.length; ensureCapacity(size + numNew); // Increments modCount int numMoved = size - index; if (numMoved > 0) System.arraycopy(elementData, index, elementData, index + numNew, numMoved); System.arraycopy(a, 0, elementData, index, numNew); size += numNew; return numNew != 0; } /** * Removes from this list all of the elements whose index is between <tt>fromIndex</tt>, inclusive, and * <tt>toIndex</tt>, exclusive. Shifts any succeeding elements to the left (reduces their index). This call shortens * the list by <tt>(toIndex - fromIndex)</tt> elements. (If <tt>toIndex==fromIndex</tt>, this operation has no * effect.) * * @param fromIndex index of first element to be removed * @param toIndex index after last element to be removed * @throws IndexOutOfBoundsException if fromIndex or toIndex out of range (fromIndex < 0 || fromIndex >= * size() || toIndex > size() || toIndex < fromIndex) */ protected void removeRange(int fromIndex, int toIndex) { modCount++; int numMoved = size - toIndex; System.arraycopy(elementData, toIndex, elementData, fromIndex, numMoved); // Let gc do its work int newSize = size - (toIndex - fromIndex); while (size != newSize) elementData[--size] = null; } /** * Checks if the given index is in range. If not, throws an appropriate runtime exception. This method does *not* * check if the index is negative: It is always used immediately prior to an array access, which throws an * ArrayIndexOutOfBoundsException if index is negative. */ private void RangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size); } /** * Save the state of the <tt>ArrayList</tt> instance to a stream (that is, serialize it). * @serialData The length of the array backing the <tt>ArrayList</tt> instance is emitted (int), followed by all of * its elements (each an <tt>Object</tt>) in the proper order. */ private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { // Write out element count, and any hidden stuff int expectedModCount = modCount; s.defaultWriteObject(); // Write out array length s.writeInt(elementData.length); // Write out all elements in the proper order. for (int i = 0; i < size; i++) s.writeObject(elementData[i]); if (modCount != expectedModCount) { throw new ConcurrentModificationException(); } } /** * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is, deserialize it). */ private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // Read in size, and any hidden stuff s.defaultReadObject(); // Read in array length and allocate array int arrayLength = s.readInt(); Object[] a = elementData = new Object[arrayLength]; // Read in all elements in the proper order. for (int i = 0; i < size; i++) a[i] = s.readObject(); }
相关推荐
标题中的“函数式编程初探共2页.pdf.zip”表明这是一个关于函数式编程的压缩文件,其中包含一个两页的PDF文档。函数式编程是一种编程范式,它将计算视为数学函数的求值,强调避免可变状态和副作用,使得程序更加简洁...
泛型允许我们在类、接口和方法中使用类型参数,使得这些构造能够处理多种数据类型,而无需进行冗余的类型转换。在“java泛型的高级用法demo”中,我们将会深入探讨Java泛型的一些高级概念和应用。 首先,泛型的基本...
在实例化这些泛型类型时,我们可以指定具体的类型,如`ArrayList<String>`。这样做的一大好处是,编译器会自动检查类型一致性,避免了不必要的类型转换,并确保容器只存储指定类型的对象。 2. **如何使用泛型?** ...
《简易超市管理系统——Java编程初探》 在Java编程领域,初学者往往通过编写实际的应用程序来提升自己的技能。这份名为"Shopping.zip"的压缩包文件,就是为Java初学者提供的一款简易超市管理系统的源代码实例。这个...
7.9.1 构造(Constructor)方法初探 181 7.9.2 如何使用构造方法 182 7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 ...
7.9.1 构造(Constructor)方法初探 181 7.9.2 如何使用构造方法 182 7.9.3 留个无参数的构造方法——给重要属性赋初始值 183 7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 ...
《Java酒店管理系统初探》 Java编程语言在软件开发领域占据着重要的地位,尤其在企业级应用中,其稳定性和可扩展性深受开发者喜爱。本项目“Java萌新作业 - 酒店管理系统”就是一个很好的实践平台,让我们一同探讨...
《基于JAVA的学生管理系统初探》 在编程领域,JAVA作为一种广泛应用的编程语言,因其跨平台性和面向对象的特点,常被用于开发各种复杂的应用系统。在这个名为"StudentSystem.zip"的压缩包中,我们找到了一个由初级...
本书是为全英文版本。 《Java完美编程(第3版)》,英文名《Absolute...第14章 泛型和arraylist类 第15章 链式数据结构 第16章 稽核,映射和迭代器 第17章 初探swing 第18章 深入swing 第19章 java的发展永无止境
- 集合框架:如ArrayList或HashMap,用于存储和管理投票数据。 - 输入/输出(I/O):如果程序需要与用户交互,那么会涉及到标准输入输出或者文件操作,用于读取和保存投票数据。 - GUI(图形用户界面):如果程序有...
List<File> filesFound = new ArrayList(); for (String path : paths) { findFilesWithExtension(path, ".txt", filesFound); } return filesFound; } private void findFilesWithExtension(String dirPath...
《Java编程初探:构建你的第一个应用程序》 Java是一种广泛使用的高级编程语言,以其跨平台、面向对象和安全性强的特点而备受青睐。"PrimaAplicatieJava"(意为“Java的第一个应用”)旨在帮助初学者理解Java编程的...
7. **集合框架**:熟悉ArrayList、LinkedList、HashSet、HashMap等基本集合类的使用,以及泛型的概念。 8. **IO流**:理解输入/输出流的概念,学习如何读写文件,以及如何使用缓冲区进行高效的数据传输。 9. **多...
Java可以利用集合框架(如ArrayList或HashMap)来存储和管理库存数据,同时,通过设计合适的类和方法,实现库存的增删改查操作。 2. **订单处理**:订单模块可能涉及接收订单、确认库存、生成发货单等流程。在Java...
《家庭猎人——Java编程初探》 "家庭猎人"这个项目,作为一个初次接触的仓库,无疑为我们提供了一个学习和实践Java编程的绝佳平台。Java作为一种广泛应用的面向对象编程语言,其强大的功能和跨平台特性使其在软件...
【标题】2015年IT学校练习:Java编程初探 在2015年的IT教育领域,Java编程语言以其强大的跨平台能力和丰富的库支持,成为许多学习者入门编程的首选。本练习旨在帮助学生熟悉Java语言的基础概念,掌握编程的基本技能...
《MyTaskManager:Java编程初探——Netcracker学习中心的第一个实验室项目》 在IT行业中,Java语言以其跨平台、面向对象以及强大的社区支持而备受青睐。本篇将深入探讨一个名为"MyTaskManager"的项目,这是一个在...
《UserNoteBook:Java编程初探》 "UserNoteBook"是一个专为用户设计的笔记本应用项目,它代表了我们编程旅程的起点。这个项目基于Java语言开发,展现了Java在构建用户界面和管理数据方面的强大功能。在深入探讨之前...