ArrayList是我们使用得最多的一个集合类之一
一般用来做包装DTO到view层来显示数据.
ArrayList继承了AbstractList类,实现了List,RandomAccess,Cloneable接口
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
内部结构是一个Object类型的数组
private transient Object[] elementData;
ArrayList的大小,也就是元素个数
private int size;
下面是几个构造函数:
1.自定义初始化容量的构造函数:
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)//初始化容量不能小于0,抛出IllegalArgumentException异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];//根据参数初始化一个数组,底层是个object数组
}
2.默认构造函数:
调用上面的构造函数,默认初始化内部数组大小为10
public ArrayList() {
this(10);//默认初始容量是10
}
3.collection转换的构造函数:
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();//调用toArray()方法把collection转换成数组
size = elementData.length;//把数组的长度赋值给ArrayList的size属性
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
返回ArrayList的大小:
public int size() {
return size;
}
判断是否为空:
public boolean isEmpty() {
return size == 0;//就是看当前size是否为0
}
找出一个元素第一次出现的下标:
public int indexOf(Object o) {
//由于数组的下标是从0开始的,所以判断是否存在只要大于0就可以了
if (o == null) {
for (int i = 0; i < size; i++)//注意这里是size属性而不是elementData的length
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))//equals方法来判断
return i;
}
return -1;//没有的话返回-1
}
判断是否包含一个元素:
public boolean contains(Object o) {
return indexOf(o) >= 0;//不存在是-1
}
元素最后一次出现的下标:
public int lastIndexOf(Object o) {
if (o == null) {
for (int i = size-1; i >= 0; i--)//注意这里的i是等于数组长度减1,从数组的最后一位开始
if (elementData[i]==null)
return i;
} else {
for (int i = size-1; i >= 0; i--)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
重新分配ArrayList空间为元素多少的真实大小:
注意size一般和内部结构的数组长度是不一样的,通过上面的构造函数我们知道内部数组初始化容量是10,
而size是在add()方法后才加一,这个方法是保证列表的大小和内部数组的大小一致
public void trimToSize() {
modCount++;
int oldCapacity = elementData.length;
if (size < oldCapacity) {
elementData = Arrays.copyOf(elementData, size);
}
}
如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数
因为每次重新分配空间都是比较消耗时间的,所以如果能预计list可能的大小
的话可以通过自己的控制ArrayList的大小来提高效率
public void ensureCapacity(int minCapacity) {//注意是public类型,也就是说可以我门自己来重新分配空间
modCount++;
int oldCapacity = elementData.length;//老的容量
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;//把当前数组临时保存起来
int newCapacity = (oldCapacity * 3)/2 + 1;//加1是为了保证oldCapacity为1或者0的情况下
if (newCapacity < minCapacity)//是按1.5被来增加容量的
newCapacity = minCapacity;
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
分享到:
相关推荐
### ArrayList源代码解析 在Java集合框架中,`ArrayList`是一个非常重要的类,它实现了`List`接口,并提供了基于动态数组的数据结构。本篇将详细分析`ArrayList`的源码,帮助读者理解其内部实现机制。 #### 类定义...
4. **集合框架**:Java集合框架包括ArrayList、LinkedList、HashSet、HashMap等,它们在源代码中会被广泛应用,用于数据的存储和操作。 5. **输入/输出流**:Java的I/O流系统广泛用于文件读写、网络通信等场景,源...
这本书不仅提供了理论知识,还通过提供源代码实例,帮助读者更好地理解和应用这些概念。 首先,数据结构是存储和组织数据的方式,它是算法设计的基础。在书中,你将学习到基本的数据结构,如数组、链表、栈、队列、...
源代码分析有助于理解它们的内部实现和性能特性。 3. **异常处理**:Java的异常处理机制通过try-catch-finally语句块确保程序的健壮性。源代码揭示了异常是如何被抛出、捕获和处理的。 4. **多线程**:Java提供了...
4. **集合框架**:Java集合框架包括ArrayList, LinkedList, HashMap等,源代码可能会有对这些数据结构的使用示例,帮助理解它们的特性和应用场景。 5. **输入/输出流**:I/O流在Java中用于读写文件或网络通信,源...
通过分析这部分源代码,开发者可以了解.NET Framework如何实现这些常用功能,以及如何优化性能和处理异常。 2. **mscorlib**: 这是.NET Framework的基础类库,包括了.NET Framework的核心类型,如System.Object、...
通过分析和运行这些源代码,学习者可以逐步掌握C#的编程技巧,提高解决问题的能力。同时,对于初学者来说,阅读他人的代码也是提升编程思维和代码风格的重要途径。因此,这个包含所有书中源代码的压缩包无疑是一个...
总之,这个“数据结构与算法分析(Java版源代码)”资源是一个宝贵的实践平台,它让我们有机会亲手实现和测试那些在理论课程中学到的抽象概念。通过深入研究和调试这些代码,我们可以加深对数据结构和算法的理解,...
Java程序设计语言源代码是学习和理解Java技术体系的重要途径,尤其对于开发者而言,阅读和分析源代码能够深化对语言特性的理解,提高编程技能。Java作为一种广泛使用的面向对象编程语言,其源代码包含了丰富的编程...
《Java语言程序设计》源...通过阅读和分析《Java语言程序设计》源代码,开发者不仅可以巩固理论知识,还能提升实际编程技能,理解如何将理论应用到实践中。这份资源对于Java初学者或有经验的开发者都是宝贵的参考资料。
源代码分析有助于理解如何进行高效的数据缓冲、错误处理和流的控制。 网络编程在现代应用中占据重要地位,Java提供了丰富的类如URL、URLConnection、Socket和ServerSocket来支持网络通信。源代码可以帮助我们理解...
以上知识点构成了Java面向对象编程的基础,通过分析和实践这些例题源代码,你可以深入理解Java的核心特性,并提高编程能力。记得不仅要阅读代码,还要动手运行和调试,这样可以从实践中更好地学习和掌握Java编程。
Java是一种广泛使用的面向对象的编程语言,以其跨平台、健壮性和安全性著称。...通过阅读和运行这些源代码,你可以加深对理论知识的理解,并将其应用于实际编程中,从而成为一名更出色的Java开发者。
通过分析和实践这些源代码,初学者可以深入学习如何利用C#来解决实际问题,而有经验的开发者则能从中探索新的编程技巧和最佳实践。 标签"C#源码"直接指明了内容的性质,这是一系列可以直接查看、编译和运行的C#代码...
4. **集合框架**:Java的集合框架是处理数据的重要工具,源代码可能包含ArrayList、LinkedList、HashMap、HashSet等集合的使用,展示了如何存储和操作数据集。 5. **输入/输出(I/O)**:源代码可能会包含对文件的...
《Visual Basic 2012入门经典》是一本...通过分析和实践这些源代码,读者不仅能掌握VB2012的基本语法,还能了解实际项目开发中的最佳实践。不断实验和修改代码,将有助于提升编程技巧,为今后的高级编程奠定坚实基础。
总之,"250个Java源代码"提供了一个全面的实践平台,涵盖了许多Java编程的核心概念和技术。通过逐一分析和运行这些代码,学习者不仅能加深对Java的理解,还能提升编程能力和问题解决技巧。无论是初学者还是经验丰富...
通过分析和修改这些源代码,你可以更好地掌握Java编程的技巧和最佳实践。 在压缩包“Final”中,包含了上述所有知识点的源代码实例。建议按照书中的章节顺序逐步学习,每学完一个概念就尝试运行和理解对应的源代码...
通过分析和运行这些源代码,你可以了解到: 1. **基础语法**:VB.NET的基本数据类型(如Integer、String、Boolean等)、变量声明、常量定义以及控制流程语句(如If...Then...Else、For...Next、While...End While等...
通过阅读和分析《Java核心技术第八版》的源代码,不仅可以加深对Java语言的理解,还能提升实际编程能力,为解决复杂问题打下坚实的基础。在学习过程中,建议结合书中的讲解逐步理解和实践,这样效果更佳。