`
cheer_nice
  • 浏览: 103183 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDK ArrayList源码学习

    博客分类:
  • j2se
阅读更多
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;
}
 
分享到:
评论

相关推荐

    jdk1.6 源码jdk1.6 源码

    例如,`java.util.concurrent`包在并发编程中提供了高级工具,如线程池、锁和并发集合,通过源码可以学习到它们的内部工作机制。 3. **异常处理**:源码中展示了如何使用try-catch-finally结构来捕获和处理异常,...

    jdk源码 jdk源码

    Java Development Kit (JDK) 源码是学习和理解Java平台核心机制的关键资源。它包含了许多关键组件的源代码,使开发者能够深入探索Java语言的底层实现,从而提升编程技巧,优化性能,并理解标准库的工作原理。在这个...

    JDK1.7源码包

    这个源码包包含了JDK1.7的所有源代码,对于开发者来说,深入研究这些源码是理解Java语言运行机制、学习优秀编程实践以及探索Java内部工作原理的重要途径。 ### 1. 新特性 #### 1.1 泛型推断(Type Inference for ...

    jdk1.6源码包

    深入研究JDK 1.6源码包,不仅可以提升对Java平台的理解,还可以学习到软件设计模式、并发处理、内存管理等高级主题。同时,通过阅读源码,开发者可以发现潜在的性能优化点,提高程序的效率和稳定性。然而,随着Java...

    jdk1.8源码下载

    JDK 1.8的源码中包含了很多关键的Java类库,如基础集合框架(如ArrayList, HashMap)、并发工具类、IO流、网络编程API以及重要的语言新特性。以下是JDK 1.8中的一些重要知识点: 1. **Lambda表达式**:这是JDK 1.8...

    JDK1.6源码

    深入研究JDK 1.6的源码对于理解Java语言的工作原理、优化代码以及学习面向对象编程设计原则具有重要意义。 1. **类加载机制** JDK 1.6中的类加载器包括Bootstrap ClassLoader、Extension ClassLoader和...

    jdk1.7源码

    通过阅读这些类的源码,可以学习到各种设计模式,如工厂模式、单例模式、装饰器模式等,同时也能理解Java内置数据结构(如`ArrayList`, `HashMap`)的实现细节,这对于提升编程技能和解决问题具有极大帮助。...

    jdk1.6源码Ecplise添加

    Java开发工具JDK1.6源码的获取与分析对于深入理解Java语言的内部机制、优化编程技巧以及排查问题有着至关重要的作用。源码能够揭示出API背后的实现细节,帮助开发者提升技能,增强代码质量。以下将详细介绍如何在...

    JDK源码,整合所有内容

    - JDK1.8中对集合框架进行了重大更新,`ArrayList`、`LinkedList`、`HashSet`、`HashMap`等都有对应的源码,可以深入理解它们的工作原理和性能差异。 - **Stream API**:新引入的流API提供了函数式编程的支持,...

    jdk1.6源码

    《深入解析JDK1.6源码》 JDK(Java Development Kit)是Java开发工具集,其中包含了Java运行环境、编译器以及各种API。...尽管JDK已更新至更高版本,但JDK1.6源码的学习仍然是开发者不可忽视的一环。

    javajdk源码学习-JavaSourceLearn:JDK源码学习

    jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...

    jdk1.8 src源码包

    如何利用JDK源码学习 - **选择主题**: 针对特定感兴趣的领域,如并发、网络编程或数据结构,深入研究相关源码。 - **阅读文档**: 结合Javadoc了解类和方法的用途和参数,这是理解源码的基础。 - **调试与实验**:...

    jdk1.8 sun源码

    这个"jdk1.8 sun源码"压缩包很可能包含了这些未公开的Sun Microsystems的源代码,使得开发者有机会深入研究Java平台的内部工作原理,这对于进行底层优化、理解和调试Java程序有着极大的帮助。然而,值得注意的是,...

    java-jdk源码学习

    Java JDK源码学习是深入理解Java编程语言的关键步骤,它能帮助开发者洞悉语言底层的工作原理,提升编程技能和优化代码的能力。JDK(Java Development Kit)是Java开发的核心工具集,包含了Java运行时环境(JRE)、...

    关于 ArrayList get(0)的异常JDK源码跟进

    这篇博客主要探讨了当尝试通过`get(0)`获取ArrayList的第一个元素时可能出现的问题,并通过JDK源码分析了其原因。 首先,我们需要了解ArrayList的内部结构。ArrayList实际上是一个基于数组实现的列表,它维护了一个...

    jdk1.8.0源码 src.zip

    通过研究这些源码,开发者不仅可以提升对Java语言的理解,还能学习到面向对象设计、并发编程、网络通信等领域的最佳实践。同时,对于遇到的性能问题、bug调试或者想要进行的定制化开发,都能从源码中找到答案。总的...

    jdk源码学习

    源码学习是提升编程技能的重要途径,通过深入理解JDK源码,我们可以洞察Java语言的内部机制,掌握其设计思想,并学习到优秀的编程实践。 在JDK源码中,有许多关键的组件和类库,如: 1. **虚拟机(JVM)**:Java...

    深入jdk6.0源码

    《深入JDK6.0源码》是一本旨在帮助开发者深入了解Java Development Kit 6.0的书籍或课程资源。...通过学习,开发者能够更好地理解和利用JDK6.0提供的工具和库,编写出更高效、更可靠的Java应用程序。

    java_jdk8源码

    以上只是Java JDK8源码中一部分关键知识点的概述,实际学习过程中,你会遇到更多关于编译器优化、垃圾收集算法、同步机制等方面的内容。通过深入阅读和理解源码,你可以提高自己的编程技巧,增强解决问题的能力,并...

    jdk的部分源码(jdk)

    通过源码,我们可以学习这些类和接口的实现,例如ArrayList和HashMap的工作原理,线程同步的细节,以及Socket通信的底层实现。 4. **异常处理**: 源码中展示了Java如何处理异常,包括检查性异常和运行时异常。理解...

Global site tag (gtag.js) - Google Analytics