ArrayList
源码解析转载自(已经很详细):
http://blog.csdn.net/u010887744/article/details/49496093
ArrayList常见的面试题转载自:
https://www.cnblogs.com/softidea/p/6410680.html
总结:
ArrayList是基于动态数组进行实现的。适合做查询,因为存在下标,不适合做增加和删除,因为会进行数组的复制,然后调用System.arrayCopy( )方法,特别消耗资源。
因此:对数据做查询操作多于增加和删除操作时,ArrayList比较适合。
question1:是如何基于动态数组的?
ArrayList的add操作首先会对数组进行检查,判断数组中的数+1是否大于其默认值10,若不大于则不进行扩容操作,若大于10,则会进行+1的扩容操作,然后底层调用System.arrayCopy( )将原数据复制到新数据进行扩容。
remove操作会将数据中的-1,容量小于10,会进行缩容操作,调用trimToSize( )恢复到10,容易=10,不会进行此操作。
注:System.arrayCopy( )会特别的消耗资源,因此ArrayList不适合做增加和删除操作。
question2:ArrayList的扩容机制?
ArrayList list = new ArrayList( );
这样子创建集合的时候,创建的容量默认是0。jdk1.8中在对集合首次进行add的时候,会将默认的容量赋值给集合的size。
扩容机制:当集合add元素的时候,会对内部的数组的size进行检查,若>10会进行扩容,扩容的源码:
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
// 此处为扩容:集合原先的容量 + 原先容量的右移1位。
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
注:右移位操作,若原先为10(十进制表示为1*2^1=2),则右移变成01(十进制表示为1*2^0=1),即右移一位表示/2。计算机是对二进制进行计算的。
因此:grow方法中机制为:扩容后size = 扩容前size + 扩容前size/2 = 1.5扩容前size。
ArrayList内部扩容机制举例说明:
如果我们现在连续插入16的对象,就会扩容两次,第一次是在插入第11个对象时(扩容为size = 10*1.5 = 15),第二次是在插入第16个对象时扩容(扩容为size= 15*1.5 = 21.5)。
本篇博客,穿插Vector实现类。
Vector与ArrayList比较:
1:Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2:当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍(2倍),而ArrayList只增加50%(1.5倍)的大小,这样ArrayList就有利于节约内存空间。
注:ArrayList内部扩容源码:
int newCapacity = oldCapacity + (oldCapacity >> 1);---扩容1.5倍。
Vector内部扩容源码:
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity);----capacityIncrement :增长系数,当增长的时候,capacityIncrement为0,扩容2倍
注:Vector现在一般都不使用,因为其内部的方法都是synchronized修饰的同步方法,会造成多线程的阻塞问题,影响性能。若集合(CopyOnWriteArrayList和ArrayList)是在方法内部创建,则用ArrayList,因为多线程不会对局部变量中的数据造成影响;若集合是当做成员变量进行使用的,存在多线程的情况下可以用jdk1.5中java.concurrent包中的CopyOnWriteArrayList并发集合类进行处理。因此,综上所述,Vector不适用。
分享到:
相关推荐
在这个主题中,我们将深入探讨如何在JNI中操作ArrayList对象并添加一个int类型的数据。 首先,我们需要理解ArrayList在Java中的本质。ArrayList是Java集合框架中的一个重要类,它实现了List接口,用于存储可变大小...
### C# 中 Array、ArrayList 和 List 的区别 在C#编程语言中,处理集合数据时,程序员经常需要根据实际需求选择合适的集合类型。本文将详细解释C#中Array、ArrayList和List之间的区别,并通过示例代码帮助理解这些...
在.NET框架中,ArrayList和DataTable是两种常用的集合类,它们分别代表了两种不同的数据存储方式。ArrayList是一个基于对象数组的动态大小的列表,而DataTable则是一个内存中的表格数据结构,通常用于存储和操作关系...
在Android开发中,ArrayList是一个非常重要的数据结构,它属于Java集合框架的一部分,但在Android环境中被广泛使用。ArrayList关键字查询是Android应用中常见的功能,尤其在显示大量数据的ListView中,用户通常需要...
在.NET框架中,ArrayList是System.Collections命名空间下的一种动态数组,它可以存储任意类型的对象,而ListBox控件则是Windows Forms应用程序中常见的用户界面元素,用于显示一个可选项目的列表。本篇将详细介绍...
在Java编程语言中,ArrayList是Java集合框架的重要组成部分,它属于List接口的一个具体实现,用于存储可变大小的有序对象列表。在这个“ArrayList实现对产品CRUD”的项目中,我们将探讨如何利用面向对象编程(OOP)...
浅析ArrayList内部实现 ArrayList是Java集合框架中的一种常用数据结构,能够存储任意多个对象,并且可以自由扩展,弥补了数组的定长的缺陷。下面我们将深入探讨ArrayList的内部实现机理。 ArrayList的内部实现机理...
首先,ArrayList是.NET Framework中的一个类,它继承自System.Collections.ArrayList,主要用于存储动态大小的可变数组。ArrayList可以存储任何类型的对象,非常灵活,但不提供类型安全。在C#中,我们通常更推荐使用...
import java.util.ArrayList; import java.util.Iterator; import java.util.Scanner; /** * @Author Ziph * @date 2020/2/19 * @Email mylifes1110@163.com */ public class TestDemo implemen
### ArrayList数据批量添加数据 #### 知识点概述 在.NET框架中,`ArrayList`类是一种动态数组,用于存储不同类型的数据。本篇文章将详细介绍如何利用`ArrayList`进行数据的批量添加,并通过一个示例来展示如何在一...
在Java编程语言中,`ArrayList`是`java.util`包中的一个重要集合类,它提供了动态数组的功能。这个数据结构允许我们存储、访问和管理一组元素。而在C语言中,由于没有内置的类似集合的数据类型,程序员需要自定义...
C# ArrayList是一个重要的数据结构,它是.NET框架早期版本中用于动态数组存储的类。这个类在System.Collections命名空间中,提供了灵活的大小调整和数据管理功能。ArrayList在C#编程中扮演了重要的角色,尤其在处理...
在C语言中,ArrayList是一种常见的数据结构,它模拟了Java或.NET等高级语言中的动态数组。ArrayList提供了在数组中添加、删除和查找元素的便利操作,而无需预先知道数组的大小。下面,我们将深入探讨如何用C语言实现...
ArrayList类是Java编程语言中一个常用的集合类,它属于Java集合框架的一部分,位于`java.util`包中。ArrayList是一个基于数组实现的动态列表,可以存储任何类型的数据,并且支持动态扩容。在本实例中,我们将深入...
### ASP .NET - ArrayList对象 在ASP .NET中,`ArrayList`对象是一种非常有用的集合类,它可以存储任意类型的对象,并且大小是动态可变的。`ArrayList`对象提供了丰富的方法来帮助开发人员处理数据,例如添加、删除...
在编程领域,尤其是在C#语言中,数组和ArrayList是两种常用的数据存储结构。它们各自有其特点和适用场景,理解并熟练运用它们是提升编程能力的关键。本文将深入探讨数组和ArrayList,帮助你掌握这两种数据结构的核心...
### ArrayList源码解析(JDK 1.8) #### 概述 `ArrayList`是Java集合框架中的一个核心组件,它提供了动态数组的功能。与固定大小的数组不同,`ArrayList`可以随着元素的增加而自动扩展其容量。在JDK 1.8中,`...
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
ArrayList是Java集合框架中常用的动态数组,它是List接口的一个实现,允许存储包括null在内的所有元素。ArrayList的主要特点是通过数组来存储元素,提供了丰富的操作方法,包括添加、删除、修改和查询等。下面是...