1.ArrayList底层结构
(1)注意事项
- ArrayList可以加入null,并且可以是多个。
- ArrayList是由数组来实现数据存储的。
- ArrayList基本等同于Vector,除了ArrayList是线程不安全(执行效率高),在多线程情况下,不建议使用ArrayList。
(2)底层结构
由上图可以看到: ArrayList 继承至AbstractList类,并实现了List、Serializable、Cloneable、RandomAccess接口。
(3)方法
2.ArrayList源码分析
(1)结论
- ArrayList中维护了一个Object类型的数组elementData,transient Object[] elementData;//transient表示瞬间,短暂的,表示该属性不会被序列化
- 当创建ArrayList对象时,如果使用的是无参构造器,则初试elementData容量为0,第一次添加则扩容elementData为10,如果再次添加,这扩容为elementData的1.5倍,也就是15,后面扩展依次类推。
- 如果使用的是指定大小的构造器,则初试elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
(2)底层源码剖析
- 使用ArrayList的无参构造器初始化(源码解析):
3.练习
主要ArrayList的一些常用方法练习:
public static void main(String[] args) {
List list = new ArrayList();
list.add("jack");
list.add(10);
list.add(new Integer(10));
list.add(true);
System.out.println("list=" + list);
list.remove(0);
list.remove(true);
System.out.println("list=" + list);
System.out.println(list.contains("jack"));
System.out.println(list.size());
System.out.println(list.isEmpty());
ArrayList list2 = new ArrayList();
list2.add("红楼梦");
list2.add("三国演义");
list.addAll(list2);
System.out.println("list=" + list);
System.out.println(list.containsAll(list2));
list.add("聊斋");
list.removeAll(list2);
System.out.println("list=" + list);
Object[] objects = list.toArray();
System.out.println(objects.toString().toCharArray());
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
|