1、ArrayList的概念
Java中的ArrayList
是Java集合框架(Java Collections Framework)中的一个非常重要且常用的类,它实现了List
接口。ArrayList
可以动态地增长和缩减,用于存储一系列的对象。与数组相比,ArrayList
提供了更加灵活和强大的功能,比如自动扩容、动态添加和删除元素等。
2、ArrayList的主要特点
-
动态数组:
ArrayList
在内部使用动态数组来存储元素。这意味着当添加元素超出当前数组容量时,ArrayList
会自动创建一个更大的数组,并将旧数组的元素复制到新数组中,以便继续添加新元素。 -
自动扩容:
ArrayList
的默认初始容量是10。但是,当添加的元素数量超过当前容量时,ArrayList
会自动扩容,以容纳更多的元素。扩容的大小通常是当前容量的1.5倍(具体实现可能因JVM实现而异)。 -
随机访问:由于
ArrayList
内部是使用数组实现的,所以可以通过索引快速访问任意位置的元素,这使得ArrayList
在需要频繁访问元素时非常高效。 -
非同步:
ArrayList
不是线程安全的。如果多个线程同时访问一个ArrayList
实例,并且至少有一个线程从结构上修改了列表(即添加或删除元素),那么它必须保持外部同步。
3、ArrayList的构造方法
new ArrayList() | 创建一个容量为0的空数组 |
new ArrayList(int initialCapacity) | 创建一个长度为Capacity的集合 |
new ArrayList(Collection<? extendsE> c) | 构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。 |
注意:
早期版本(如JDK 1.6及之前)
在早期的Java版本中,如JDK 1.6及之前,使用ArrayList
的空参构造(即new ArrayList()
)时,确实会默认创建一个容量为10的列表。这是通过在构造方法中直接初始化一个长度为10的数组来实现的。
后续版本(如JDK 1.7及之后)
然而,从JDK 1.7开始,Java对ArrayList
的实现进行了优化,特别是在空参构造的初始容量上。在JDK 1.7及之后的版本中,使用ArrayList
的空参构造时,并不会立即创建一个容量为10的数组。相反,它会使用一个空的数组(长度为0)作为初始的elementData
数组。这个空数组是通过private static final Object[] EMPTY_ELEMENTDATA = {}
定义的。这样做的目的是为了节省空间,因为只有在真正需要添加元素时,才会进行扩容操作。
4、ArrayList的方法
方法名 | 作用 |
public boolean add(E e) | 添加新元素到集合的末尾 |
public boolean remove(E e) | 删除指定元素 |
public E remove(int index) | 删除索引处的元素,并返回元素 |
public E set(int index,E element) | 修改索引元素的信息,并返回元素 |
public E get(int index) | 得到索引处的元素 |
public int size() | 返回集合中的元素的个数 |
public void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
(1)添加元素
ArrayList<user> myArrayList = new ArrayList<>();
user b1 = new user("ooop","wad8ywd","dhaiw");
user b2 = new user("ooop1","wad8ywd1","dhaiw1");
user b3 = new user("ooop2","wad8ywd2","dha2iw");
//直接添加元素
a.add(b1);
a.add(b2);
a.add(b3);
(2)添加元素到指定位置
ArrayList<E> myArrayList = new ArrayList<>();
myArrayList.add(int i,E c);
注释:int i 是集合的指定位置下标,E c是集合的数据类型
(3)删除指定元素
ArrayList<E> myArrayList = new ArrayList<>();
//添加新元素
myArrayList.add(E c1);
myArrayList.add(E c2);
myArrayList.add(E c3);
//删除元素
myArrayList.remove(c1);
//删除指定元素
myArrayList.remove(1);
(4)得到集合元素个数
ArrayList<E> myArrayList = new ArrayList<>();
//添加新元素
myArrayList.add(E c1);
myArrayList.add(E c2);
myArrayList.add(E c3);
//得到集合元素个数
myArrayList.size();
//结果为3;
(5)修改元素信息
ArrayList<E> myArrayList = new ArrayList<>();
//添加新元素
myArrayList.add(E c1);
myArrayList.add(E c2);
myArrayList.add(E c3);
//修改元素
myArrayList.set(int i,E c4);
注释:int i是集合的索引,E c4是新的元素信息
(6)根据索引得到集合元素信息
ArrayList<E> myArrayList = new ArrayList<>();
//添加新元素
myArrayList.add(E c1);
myArrayList.add(E c2);
myArrayList.add(E c3);
//得到元素信息
myArrayList.get(0);
注释:因为E是引用数据类型,所有get得到的结果是c1的地址值