一、ArrayList的简介:
ArrayList是底层基于数组实现的集合,但是ArrayList比起数组有一个可以动态改变容量的特性。
ArrayList继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
二、ArrayList中的一些常用方法:
首先,定义一个ArrayList类型的对象
ArrayList<String> arraylist=new Arraylist<String>();
1、add方法:添加元素
arraylist.add("aaa");
arraylist.add("bbb");
arraylist.add("ccc");
//添加了三个元素
2、contains方法:用于判断ArrayList中是否含有某个对象
arraylist.contains("ddd")
//此时会输出false,因为arraylist中没有这个对象。
注意:contains方法是调用了Object类的equals方法,所以说实际上比较是否含有这个对象是从引用方面上比较的,而不是对象的数据内容比较的。如果想要从其他角度判断是否含有某个对象的时候(比如根据Student类里边的一个number属性去判断是否含有该名学生时)则需要对equals方法进行重写。
例:
class Boy{
int age;
String name;
Boy(int age,String name){
this.name=name;
this.age=age;
}
}
public static void main(String[] args){
ArrayList<Boy> boys=new Arraylist<Boy>();
boys.add(new(18,"jack"));
boys.contains(new(18,"jack"));
}
此时会返回false,因为虽然两个对象之间存放的数据是一样的,但是本质上是两个仅内容一样的对象而不是同一个对象。
3、get方法:用于获取指定位置的元素
arraylist.get(2);
//ArrayList与数组是近似的,所以会输出第三个元素"ccc"
arraylist.get(3);
//会报错,因为下标越界了。
4、indexOf方法:用于以下标的形式获取元素在ArrayList中的位置:
注意:indexOf方法与contains方法一样是从引用的角度去判断一个元素的,如果不想以引用来判断而是希望用对象的其他属性去判断的话,需要重写equals方法。
arraylist.indexOf("bbb");
//输出结果是"bbb"的下标,也就是1
arraylist.indexOf("abc");
//会返回-1,因为arraylist中并不含这个元素
5、remove方法:用于按下标或者指定对象来删除ArrayList中的元素
arraylist.remove(2);
//删除集合中下标为2的位置的元素
arraylist.remove("ccc")
//删除集合中的"ccc"元素
6、set方法:用于将指定下标所指向的元素替换为其他元素
arraylist.set(2,"ddd");
//将数组中下标为2的元素替换为"ddd"
7、size方法:用于获取目前集合的大小
System.out.println(arraylist.size());
//输出3,因为有三个元素
8、toArray方法:用于将集合转化为数组
注意:转换后的数组默认是Object [ ]类型的,所以如果需要将集合转换为某种类型的数组时,需要添加一个强制数据类型转换。
例:现在有一个装有自定义的名为Student类型的ArrayList集合对象名为group1,需要将group1转换成为Student类型的数组group01的操作如下。
Student group01[]=(Student[])group1.toArray(new Student[]());
9、addAll方法:用于将另一个ArrayList集合中的所有元素添加进来。
ArrayList<String> arraylist2=new Arraylist<String>();
arraylist2.add("ddd");
arraylist2.add("eee");
arraylist.addAll(arraylist2);
//此时arraylist里边就是"aaa"、"bbb"、"ccc"、"ddd"、"eee"五个元素
10、clear方法:用于清空集合
arraylist.clear();
//执行该语句之后集合为空,没有任何元素。
三、ArrayList与数组之间的区别与联系
ArrayList与数组之间的联系:
ArrayList底层由数组实现,所以数组中原本拥有的方法例如Index、IndexOf、Contains、Sort等其他方法ArrayList中也有。
但是比起数组又有着可以随添加元素的数量而扩容的能力。而ArrayList动态扩容的原因是底层在每次添加元素的时候都会进行一次对数组容量的判断,来决定是否需要扩容。
ArrayList与数组之间的区别:
1、ArrayList是可以动态扩容的,临时添加元素也是可以的;但是数组是不可以的,数组在声明时就是一个长度已经确定的集合。
2、因为ArrayList的动态扩容机制需要对容量判断,所以在执行Add、AddRange、Insert、InsertRange等添加元素的方法的时候效率要低于数组。
3、ArrayList只能通过泛型来决定存入元素种类,这就导致ArrayList不能将基本数据类型作为其元素,但是数组可以。
4、ArrayList因为是数组来实现的,所以ArrayList的一些方法是数组所不具备的,例如remove删除方法。
总结:当数据量确定的时候使用数组更好,因为效率更高;但是如果数据量不确定的时候使用ArrayList更加好,因为能够灵活的动态扩容。
四、数组与ArrayList之间的相互转换:
1、ArrayList转换为数组:
使用ArrayList自带的toArray方法就可以。
2、数组转换为ArrayList:
使用数组的asList方法即可。
例:
public static void main(String[] args) {
String[] array=new String[3];
array[0]="aaa";
array[1]="bbb";
array[2]="ccc";
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(array));
}