`
liuxinglanyue
  • 浏览: 562641 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ArrayList源代码分析(一) (转)

阅读更多

ArrayList是我们使用得最多的一个集合类之一

一般用来做包装DTO到view层来显示数据.

 

ArrayList继承了AbstractList类,实现了List,RandomAccess,Cloneable接口

Java代码 
  1. public class ArrayList<E> extends AbstractList<E>  
  2.         implements List<E>, RandomAccess, Cloneable, java.io.Serializable  

 

内部结构是一个Object类型的数组

Java代码 
  1. private transient Object[] elementData;  

 ArrayList的大小,也就是元素个数

Java代码 
  1. private int size;  

 

下面是几个构造函数:

1.自定义初始化容量的构造函数:

Java代码 
  1. public ArrayList(int initialCapacity) {  
  2. super();  
  3.        if (initialCapacity < 0)//初始化容量不能小于0,抛出IllegalArgumentException异常  
  4.            throw new IllegalArgumentException("Illegal Capacity: "+  
  5.                                               initialCapacity);  
  6. this.elementData = new Object[initialCapacity];//根据参数初始化一个数组,底层是个object数组  
  7.    }  

 2.默认构造函数:

调用上面的构造函数,默认初始化内部数组大小为10

Java代码 
  1. public ArrayList() {  
  2. s(10);//默认初始容量是10  
  3. }  

 3.collection转换的构造函数:

Java代码 
  1.    public ArrayList(Collection<? extends E> c) {  
  2. elementData = c.toArray();//调用toArray()方法把collection转换成数组  
  3. size = elementData.length;//把数组的长度赋值给ArrayList的size属性  
  4. // c.toArray might (incorrectly) not return Object[] (see 6260652)  
  5. if (elementData.getClass() != Object[].class)  
  6.     elementData = Arrays.copyOf(elementData, size, Object[].class);  
  7.    }  

 返回ArrayList的大小:

Java代码 
  1. public int size() {  
  2. urn size;  
  3. }  

 

判断是否为空:

Java代码 
  1. public boolean isEmpty() {  
  2. urn size == 0;//就是看当前size是否为0  
  3. }  

 找出一个元素第一次出现的下标:

Java代码 
  1.    public int indexOf(Object o) {  
  2.     //由于数组的下标是从0开始的,所以判断是否存在只要大于0就可以了  
  3. if (o == null) {  
  4.     for (int i = 0; i < size; i++)//注意这里是size属性而不是elementData的length  
  5.     if (elementData[i]==null)  
  6.         return i;  
  7. else {  
  8.     for (int i = 0; i < size; i++)  
  9.     if (o.equals(elementData[i]))//equals方法来判断  
  10.         return i;  
  11. }  
  12. return -1;//没有的话返回-1  
  13.    }  

 

判断是否包含一个元素:

Java代码 
  1. public boolean contains(Object o) {  
  2. urn indexOf(o) >= 0;//不存在是-1  
  3. }  

 

元素最后一次出现的下标:

Java代码 
  1.   public int lastIndexOf(Object o) {  
  2. if (o == null) {  
  3.     for (int i = size-1; i >= 0; i--)//注意这里的i是等于数组长度减1,从数组的最后一位开始  
  4.     if (elementData[i]==null)  
  5.         return i;  
  6. else {  
  7.     for (int i = size-1; i >= 0; i--)  
  8.     if (o.equals(elementData[i]))  
  9.         return i;  
  10. }  
  11. return -1;  
  12.    }  

 重新分配ArrayList空间为元素多少的真实大小:

注意size一般和内部结构的数组长度是不一样的,通过上面的构造函数我们知道内部数组初始化容量是10,

而size是在add()方法后才加一,这个方法是保证列表的大小和内部数组的大小一致

Java代码 
  1.    public void trimToSize() {  
  2. modCount++;  
  3. int oldCapacity = elementData.length;  
  4. if (size < oldCapacity) {  
  5.            elementData = Arrays.copyOf(elementData, size);  
  6. }  
  7.    }  

 如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数

因为每次重新分配空间都是比较消耗时间的,所以如果能预计list可能的大小
的话可以通过自己的控制ArrayList的大小来提高效率

Java代码 
  1.    public void ensureCapacity(int minCapacity) {//注意是public类型,也就是说可以我门自己来重新分配空间  
  2. modCount++;  
  3. int oldCapacity = elementData.length;//老的容量  
  4. if (minCapacity > oldCapacity) {  
  5.     Object oldData[] = elementData;//把当前数组临时保存起来  
  6.     int newCapacity = (oldCapacity * 3)/2 + 1;//加1是为了保证oldCapacity为1或者0的情况下  
  7.         if (newCapacity < minCapacity)//是按1.5被来增加容量的  
  8.     newCapacity = minCapacity;  
  9.            // minCapacity is usually close to size, so this is a win:  
  10.            elementData = Arrays.copyOf(elementData, newCapacity);  
  11. }  
  12.    }  

 

分享到:
评论

相关推荐

    arrayList源代码

    ### ArrayList源代码解析 在Java集合框架中,`ArrayList`是一个非常重要的类,它实现了`List`接口,并提供了基于动态数组的数据结构。本篇将详细分析`ArrayList`的源码,帮助读者理解其内部实现机制。 #### 类定义...

    164个完整的Java程序源代码

    4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet、HashMap等,它们在源代码中会被广泛应用,用于数据的存储和操作。 5. **输入/输出流**:Java的I/O流系统广泛用于文件读写、网络通信等场景,源...

    数据结构与算法分析(java版内含源代码)

    这本书不仅提供了理论知识,还通过提供源代码实例,帮助读者更好地理解和应用这些概念。 首先,数据结构是存储和组织数据的方式,它是算法设计的基础。在书中,你将学习到基本的数据结构,如数组、链表、栈、队列、...

    .net 官方部分源代码 

    通过分析这部分源代码,开发者可以了解.NET Framework如何实现这些常用功能,以及如何优化性能和处理异常。 2. **mscorlib**: 这是.NET Framework的基础类库,包括了.NET Framework的核心类型,如System.Object、...

    java核心技术源代码

    源代码分析有助于理解它们的内部实现和性能特性。 3. **异常处理**:Java的异常处理机制通过try-catch-finally语句块确保程序的健壮性。源代码揭示了异常是如何被抛出、捕获和处理的。 4. **多线程**:Java提供了...

    Java自学程序源代码

    Java自学程序源代码是初学者和进阶者深入理解编程语言的重要资源,它提供了一手的实践材料,帮助学习者通过实例来探索和掌握Java语言的核心概念和特性。以下是一些关键的知识点,这些知识点可以从这个"Java自学程序...

    数据结构与算法分析(java版源代码)

    总之,这个“数据结构与算法分析(Java版源代码)”资源是一个宝贵的实践平台,它让我们有机会亲手实现和测试那些在理论课程中学到的抽象概念。通过深入研究和调试这些代码,我们可以加深对数据结构和算法的理解,...

    c# 程序源代码

    通过分析和运行这些源代码,学习者可以逐步掌握C#的编程技巧,提高解决问题的能力。同时,对于初学者来说,阅读他人的代码也是提升编程思维和代码风格的重要途径。因此,这个包含所有书中源代码的压缩包无疑是一个...

    java大全书上源代码2

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和安全性著称。...通过阅读和运行这些源代码,你可以加深对理论知识的理解,并将其应用于实际编程中,从而成为一名更出色的Java开发者。

    Java程序设计语言源代码

    Java程序设计语言源代码是学习和理解Java技术体系的重要途径,尤其对于开发者而言,阅读和分析源代码能够深化对语言特性的理解,提高编程技能。Java作为一种广泛使用的面向对象编程语言,其源代码包含了丰富的编程...

    《Java语言程序设计》源代码

    《Java语言程序设计》源代码是一份非常宝贵的教育资源,它包含了一系列用于教学和学习Java编程的实例。这些源代码能够帮助初学者深入理解Java语言的核心概念、语法结构以及编程实践。下面将对Java语言的一些关键知识...

    一个java常用类库的源代码

    源代码分析有助于理解如何进行高效的数据缓冲、错误处理和流的控制。 网络编程在现代应用中占据重要地位,Java提供了丰富的类如URL、URLConnection、Socket和ServerSocket来支持网络通信。源代码可以帮助我们理解...

    Java面向对象程序设计课本例题源代码

    以上知识点构成了Java面向对象编程的基础,通过分析和实践这些例题源代码,你可以深入理解Java的核心特性,并提高编程能力。记得不仅要阅读代码,还要动手运行和调试,这样可以从实践中更好地学习和掌握Java编程。

    C#源代码大全(基于C#程序设计的源程序)

    通过分析和实践这些源代码,初学者可以深入学习如何利用C#来解决实际问题,而有经验的开发者则能从中探索新的编程技巧和最佳实践。 标签"C#源码"直接指明了内容的性质,这是一系列可以直接查看、编译和运行的C#代码...

    Visual Basic 2012入门经典 源代码

    《Visual Basic 2012入门经典》是一本...通过分析和实践这些源代码,读者不仅能掌握VB2012的基本语法,还能了解实际项目开发中的最佳实践。不断实验和修改代码,将有助于提升编程技巧,为今后的高级编程奠定坚实基础。

    250个java源代码

    总之,"250个Java源代码"提供了一个全面的实践平台,涵盖了许多Java编程的核心概念和技术。通过逐一分析和运行这些代码,学习者不仅能加深对Java的理解,还能提升编程能力和问题解决技巧。无论是初学者还是经验丰富...

    java编程思想第四版源代码.7z

    4. **集合框架**:Java的集合框架是处理数据的重要工具,源代码可能包含ArrayList、LinkedList、HashMap、HashSet等集合的使用,展示了如何存储和操作数据集。 5. **输入/输出(I/O)**:源代码可能会包含对文件的...

    java简单实例程序源代码

    Java是一种广泛使用的面向对象...通过分析和运行这些源代码,学习者可以逐步理解并掌握Java语言的核心概念。在学习过程中,建议结合相关教材或在线教程,以加深对每个概念的理解,并尝试自己编写代码,以提升编程技能。

    VB.NET课本源代码

    通过分析和运行这些源代码,你可以了解到: 1. **基础语法**:VB.NET的基本数据类型(如Integer、String、Boolean等)、变量声明、常量定义以及控制流程语句(如If...Then...Else、For...Next、While...End While等...

    java 从入门到精通 源代码

    通过分析和修改这些源代码,你可以更好地掌握Java编程的技巧和最佳实践。 在压缩包“Final”中,包含了上述所有知识点的源代码实例。建议按照书中的章节顺序逐步学习,每学完一个概念就尝试运行和理解对应的源代码...

Global site tag (gtag.js) - Google Analytics