ArrayList类的声明部分 实现的借口 继承了AbstractList类
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
注意 ArrayList不是线程安全的!!!Vector是
private transient Object[] elementData
用数组保存内容 数组是Object类型
用transient声明一个实例变量,当对象存储时,它的值不需要维持
public ArrayList() {
this(10);
}
默认构造器 默认的size是10
另外两个构造器
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
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);
}
类里面的一些方法
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) { //可见 ArrayList可以存放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;
}
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;
}
public E set(int index, E element) {
RangeCheck(index);
E oldValue = (E) elementData[index];
elementData[index] = element;
return oldValue; // oldValue 注意这个函数的返回值
}
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
public void ensureCapacity(int minCapacity) { //这个方法很重要动态增长数组 当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
modCount++;
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1; // 增加1.5 倍 扩容
if (newCapacity < minCapacity)
newCapacity = minCapacity; //至少要扩容到 minCapacity
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
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); // System.arraycopy 是一个native方法
elementData[index] = element;
size++;
}
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); //将index之后的元素依次向前移动
elementData[--size] = null; // Let gc do its work 让最后一个位置 置成null 好回收
return oldValue;
}
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index); //fastRemove 与 remove 的区别就是fastRemove返回类型是void 而且不用进行范围检查
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
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
}
protected void removeRange(int fromIndex, int toIndex) {// 先整体移动向前,然后把后面的置null
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;
}
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;
}
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;
}
分享到:
相关推荐
例如,`java.util.concurrent`包在并发编程中提供了高级工具,如线程池、锁和并发集合,通过源码可以学习到它们的内部工作机制。 3. **异常处理**:源码中展示了如何使用try-catch-finally结构来捕获和处理异常,...
Java Development Kit (JDK) 源码是学习和理解Java平台核心机制的关键资源。它包含了许多关键组件的源代码,使开发者能够深入探索Java语言的底层实现,从而提升编程技巧,优化性能,并理解标准库的工作原理。在这个...
这个源码包包含了JDK1.7的所有源代码,对于开发者来说,深入研究这些源码是理解Java语言运行机制、学习优秀编程实践以及探索Java内部工作原理的重要途径。 ### 1. 新特性 #### 1.1 泛型推断(Type Inference for ...
深入研究JDK 1.6源码包,不仅可以提升对Java平台的理解,还可以学习到软件设计模式、并发处理、内存管理等高级主题。同时,通过阅读源码,开发者可以发现潜在的性能优化点,提高程序的效率和稳定性。然而,随着Java...
JDK 1.8的源码中包含了很多关键的Java类库,如基础集合框架(如ArrayList, HashMap)、并发工具类、IO流、网络编程API以及重要的语言新特性。以下是JDK 1.8中的一些重要知识点: 1. **Lambda表达式**:这是JDK 1.8...
深入研究JDK 1.6的源码对于理解Java语言的工作原理、优化代码以及学习面向对象编程设计原则具有重要意义。 1. **类加载机制** JDK 1.6中的类加载器包括Bootstrap ClassLoader、Extension ClassLoader和...
通过阅读这些类的源码,可以学习到各种设计模式,如工厂模式、单例模式、装饰器模式等,同时也能理解Java内置数据结构(如`ArrayList`, `HashMap`)的实现细节,这对于提升编程技能和解决问题具有极大帮助。...
Java开发工具JDK1.6源码的获取与分析对于深入理解Java语言的内部机制、优化编程技巧以及排查问题有着至关重要的作用。源码能够揭示出API背后的实现细节,帮助开发者提升技能,增强代码质量。以下将详细介绍如何在...
- JDK1.8中对集合框架进行了重大更新,`ArrayList`、`LinkedList`、`HashSet`、`HashMap`等都有对应的源码,可以深入理解它们的工作原理和性能差异。 - **Stream API**:新引入的流API提供了函数式编程的支持,...
《深入解析JDK1.6源码》 JDK(Java Development Kit)是Java开发工具集,其中包含了Java运行环境、编译器以及各种API。...尽管JDK已更新至更高版本,但JDK1.6源码的学习仍然是开发者不可忽视的一环。
jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...
如何利用JDK源码学习 - **选择主题**: 针对特定感兴趣的领域,如并发、网络编程或数据结构,深入研究相关源码。 - **阅读文档**: 结合Javadoc了解类和方法的用途和参数,这是理解源码的基础。 - **调试与实验**:...
这个"jdk1.8 sun源码"压缩包很可能包含了这些未公开的Sun Microsystems的源代码,使得开发者有机会深入研究Java平台的内部工作原理,这对于进行底层优化、理解和调试Java程序有着极大的帮助。然而,值得注意的是,...
Java JDK源码学习是深入理解Java编程语言的关键步骤,它能帮助开发者洞悉语言底层的工作原理,提升编程技能和优化代码的能力。JDK(Java Development Kit)是Java开发的核心工具集,包含了Java运行时环境(JRE)、...
这篇博客主要探讨了当尝试通过`get(0)`获取ArrayList的第一个元素时可能出现的问题,并通过JDK源码分析了其原因。 首先,我们需要了解ArrayList的内部结构。ArrayList实际上是一个基于数组实现的列表,它维护了一个...
通过研究这些源码,开发者不仅可以提升对Java语言的理解,还能学习到面向对象设计、并发编程、网络通信等领域的最佳实践。同时,对于遇到的性能问题、bug调试或者想要进行的定制化开发,都能从源码中找到答案。总的...
源码学习是提升编程技能的重要途径,通过深入理解JDK源码,我们可以洞察Java语言的内部机制,掌握其设计思想,并学习到优秀的编程实践。 在JDK源码中,有许多关键的组件和类库,如: 1. **虚拟机(JVM)**:Java...
《深入JDK6.0源码》是一本旨在帮助开发者深入了解Java Development Kit 6.0的书籍或课程资源。...通过学习,开发者能够更好地理解和利用JDK6.0提供的工具和库,编写出更高效、更可靠的Java应用程序。
以上只是Java JDK8源码中一部分关键知识点的概述,实际学习过程中,你会遇到更多关于编译器优化、垃圾收集算法、同步机制等方面的内容。通过深入阅读和理解源码,你可以提高自己的编程技巧,增强解决问题的能力,并...
通过源码,我们可以学习这些类和接口的实现,例如ArrayList和HashMap的工作原理,线程同步的细节,以及Socket通信的底层实现。 4. **异常处理**: 源码中展示了Java如何处理异常,包括检查性异常和运行时异常。理解...