1.什么是ArrayList以及ArrayList的功能。
ArrayList 是一个数组队列,相当于动态数组。
可以动态扩容—->继承了AbstractList类实现了List接口。
可以随机访问—->实现了RandomAccess类。
可以克隆—–>实现了Cloneable类。
实现了序列化—–>java.io.Serializable类。
但是ArrayList不是线程安全的,建议使用Vector,CopyOnWriteArrayList等。
2.构造函数
除了默认的构造函数外还有
1.ArrayList(int capacity)
2.ArrayList(Collection<? extends E> collection)
ArrayList的数据是存放在一个动态数组中,这个数组的大小能够在初始化ArrayList时候确定,默认为10.ensureCapacity保证了增长的方式。
ArrayList遍历方式是
1.通过Iterator去遍历。
2.通过for循环
3.随机访问。
3.toArray()
1.toArray有两个重载函数
list.array()
list.array(T[] a)
2.使用这两中的第一种重载函数的时候有可能会出现
public class TestArrayList {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> array = new ArrayList<String>();
for(int i = 0;i < 10;i++){
array.add("" + i);
}
String[] a = (String [])array.toArray();
}
}
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at testproject1.TestArrayList.main(TestArrayList.java:13)
字面意思很明显说明不能够从Object[]专成String[]
这是为什么呢:因为Object[]和String[]是两种不兼容的类型。
当然也有修改方案:先把Object[]取出来,然后在外层转换,不过这样麻烦且没意义。
使用第二种重载方法
public class TestArrayList {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<String> list = new ArrayList<String>();
for(int i = 0;i < 10;i++){
list.add("" + i);
}
String[] a = new String[list.size()];
list.toArray(a);
System.out.println(a + " dsfasd " + list.size());
System.out.println(a[1]);
}
}
先定义且初始化一个String的数组,然后把这个数组作为一个泛型传入toArray当然也可这样写。这样也是最常用的。
String[] array= list.toArray(new String[0]);
4.迭代方法
随机访问
Integer value = null;
Iterator iter = list.iterator();
while (iter.hasNext()) {
value = (Integer)iter.next();
}
遍历
Integer value = null;
int size = list.size();
for (int i=0; i<size; i++) {
value = (Integer)list.get(i);
}
迭代器 好处:不许要计算长度了。
Integer value = null;
for (Integer integ:list) {
value = integ;
}
5.ArrayList明显是线程不安全的。
6.ArrayList和LinkedList的区别
1.简单比较
LinkedList从名字上可以看到和ArrayList一样都是动态扩容,他们都实现了List接口,但不同的是,ArrayList是基于数组实现的,LinkedList是基于链表实现的。通过比较链表和数组的优缺点也可以看到,ArrayList的访问效率更高,LInkedList的插入删除效率更高。
2.LinkedList的定义
LinkedList继承于AbstractSequentialList所以是一个双向链表
LinkedList实现了List能对它进行队列操作。
LinkedList实现了Cloneable,能够克隆。
支持序列化。
3.数据结构原理
摘自这个博客
可以这样说:
当是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的某个元素时,使用ArrayList会比较好;
当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。