文章目录
- 一、简介
- 二、使用
- 1、构造
- 1.1 无参构造
- 1.2 指定初始容量
- 1.3 利用其他的collection进行构造
- 2、基础操作
- 2.1 添加元素
- 2.2 删除元素
- 2.3 修改元素
- 2.4 访问元素
- 2.5 计算大小
- 2.6 遍历数组
- 3、常用操作
- 4、扩容机制
- 三、模拟实现ArrayList
一、简介
ArrayList
类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList
继承了AbstractList
,并实现了List
接口。
ArrayList
类位于java.util
包中,使用前需要引入它,语法格式如下:
importjava.util.ArrayList;ArrayList<E> objectName=newArrayList<>();
- E: 泛型数据类型,用于设置
objectName
的数据类型,只能为引用数据类型。 - objectName: 对象名。
注:
ArrayList
实现了RandomAccess
接口,表明ArrayList
支持随机访问。ArrayList
实现了Cloneable
接口,表明ArrayList
是可以clone的。ArrayList
实现了Serializable
接口,表明ArrayList
是支持序列化的。- 和
Vector
不同,ArrayList
不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector
或者CopyOnWriteArrayList
。 ArrayList
底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。
二、使用
1、构造
ArrayList有三种构造方式:无参构造、利用其他的collection构造、指定顺序表的初始容量。
1.1 无参构造
无参构造类型是推荐的写法。
List<Integer> list=newArrayList<>();
1.2 指定初始容量
List<Integer> list=newArrayList<>(10);
list.add(1);
list.add(2);
list.add(3);
1.3 利用其他的collection进行构造
ArrayList<Integer> list2=newArrayList<>(list1);
注: 无论哪种构造形式,都应该避免省略类型,任意类型的元素都能够存放,使用时会带来很多麻烦。
2、基础操作
2.1 添加元素
添加元素到ArrayList
可以使用add()
方法:
publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<String>();
sites.add("Hello");
sites.add("CSDN");System.out.println(array);}}
2.2 删除元素
删除元素使用remove()
方法:
publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
array.add("Hello");
array.add("CSDN");
array.add("IDEA");
array.add("Java");System.out.println(array);
array.remove(2);System.out.println(array);}}
2.3 修改元素
修改元素可以使用set()
方法:
publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
array.add("Hello");
array.add("CSDN");
array.add("IDEA");
array.add("Java");System.out.println(array);
array.set(2,"python");System.out.println(array);}}
2.4 访问元素
访问元素使用get()方法:
publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
array.add("Hello");
array.add("CSDN");
array.add("IDEA");
array.add("Java");System.out.println(array);System.out.println(array.get(2));}}
2.5 计算大小
计算数组内元素个数使用size()
方法:
publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
array.add("Hello");
array.add("CSDN");
array.add("IDEA");
array.add("Java");System.out.println(array);System.out.println(array.size());}}
2.6 遍历数组
遍历数组有三种方式:for循环遍历、for-each遍历、迭代器遍历。
publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();
array.add("Hello");
array.add("CSDN");
array.add("IDEA");
array.add("Java");System.out.println(array);System.out.println("for:");for(int i=0; i< array.size(); i++){System.out.print(array.get(i)+" ");}System.out.println();System.out.println("for-each:");for(String j:array){System.out.print(j+" ");}System.out.println();System.out.println("迭代器:");Iterator<String> it= array.listIterator();while(it.hasNext()){System.out.print(it.next()+" ");}System.out.println();}
3、常用操作
方法 | 作用 |
---|
void add(int index, E element) | 将element元素插入到index位置 |
boolean addAll(Collection extends E> c) | 将c中的元素全部插入 |
boolean remove(Object o) | 删除第一个遇到的o元素 |
void clear() | 清空 |
boolean contains(Object o) | 判断o是否在表中 |
int indexOf(Object o) | 返回第一个o所在的下标 |
int lastIndexOf(Object o) | 返回最后一个o的下标 |
List subList(int fromIndex, int toIndex) | 截取fromindex到toindex的元素 |
publicclassTest{publicstaticvoidmain(String[] args){ArrayList<String> array=newArrayList<>();ArrayList<String> array2=newArrayList<>();
array.add("Hello");
array.add("CSDN");
array.add("Java");
array.add("IDEA");
array2.add("python");
array2.add("Java");
array.add(1,"Data");System.out.println("array = "+ array);
array2.addAll(array);System.out.println("array2 = "+ array2);
array2.remove("Data");System.out.println("array2 = "+ array2);
array.clear();System.out.println("array = "+ array);System.out.println("Java是否在表中:"+ array2.contains("Java"));System.out.println("array2.indexOf(\"Java\") = "+ array2.indexOf("Java"));System.out.println("array2.lastIndexOf(\"Java\") = "+ array2.lastIndexOf("Java"));System.out.println("array2.subList(1,4) = "+ array2.subList(1,4));}
4、扩容机制
ArrayList是一个动态类型的顺序表,即,在插入元素的过程中会自动扩容:
Object[] elementData;privatestaticfinalObject[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};privatestaticfinalint DEFAULT_CAPACITY=10;publicvoidensureCapacity(int minCapacity){int minExpand=(elementData!= DEFAULTCAPACITY_EMPTY_ELEMENTDATA)?0:
DEFAULT_CAPACITY;if(minCapacity> minExpand){ensureExplicitCapacity(minCapacity);}}privatevoidensureExplicitCapacity(int minCapacity){
modCount++;if(minCapacity- elementData.length>0)grow(minCapacity);}privatestaticfinalint MAX_ARRAY_SIZE=Integer.MAX_VALUE-8;privatevoidgrow(int minCapacity){int oldCapacity= elementData.length;int newCapacity= oldCapacity+(oldCapacity>>1);if(newCapacity- minCapacity<0)
newCapacity= minCapacity;if(newCapacity- MAX_ARRAY_SIZE>0)
newCapacity=hugeCapacity(minCapacity);
elementData=Arrays.copyOf(elementData, newCapacity);}privatestaticinthugeCapacity(int minCapacity){if(minCapacity<0)thrownewOutOfMemoryError();return(minCapacity> MAX_ARRAY_SIZE)?Integer.MAX_VALUE: MAX_ARRAY_SIZE;}
三、模拟实现ArrayList
为了更好的理解和使用ArrayList,对其进行了模拟实现
之前单独写过一篇博客进行模拟:Java——模拟实现ArrayList(动态数组)