【1】JDK1.7中的ArrayList底层
package zhai.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ArrayListDemo1 {
public static void main(String[] args) {
// 多态实现 使用前两种方式进行创建集合的话
// 扩展性很高 (建议使用前两种方式进行创建,因为由于Collection接口中没有get方法)
// 使用集合中最大的父接口进行指向 ArrayList 实现类 Collection >>> ArrayList(爷-->孙级)
Collection c = new ArrayList();
// 使用父接口进行创建 List-->ArrayList(父子级)
List l = new ArrayList(); // 所以 使用父子级进行创建是最佳选择
// 直接使用 ArrayList 类进行创建实体对象 (不建议直接使用该类进行创建 扩展性低)
ArrayList list = new ArrayList();
}
}
注意:1.7中默认创建一个ArrayList集合的时候,默认长度为10,也就是size=10;
package zhai.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ArrayListDemo1 {
public static void main(String[] args) {
// 多态实现 使用前两种方式进行创建集合的话
// 扩展性很高 (建议使用前两种方式进行创建,因为由于Collection接口中没有get方法)
// 使用集合中最大的父接口进行指向 ArrayList 实现类 Collection >>> ArrayList(爷-->孙级)
Collection c = new ArrayList();
// 使用父接口进行创建 List-->ArrayList(父子级)
List l = new ArrayList(); // 所以 使用父子级进行创建是最佳选择
// 直接使用 ArrayList 类进行创建实体对象 (不建议直接使用该类进行创建 扩展性低)
ArrayList list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
System.out.println(list);
}
}
输出:
[zhangsan, lisi] // 默认使用ArrayList中的toString方法进行输出
注意:调用add方法向底层数组中添加元素,最开始size为0,添加元素以后size+1操作,添加成功返回true.
当数组中的10个位置都满了的时候就开始进行数组的扩容,使用add方法中的ensureCapacityInternal约束中的grow()方法进行扩容,将老数组中的内容赋值给新数组返回新数组,长度为原数组的1.5倍(也就是15),15要是满了就以此类推可以有无限长度。
1.7中的ArrayList中最主要的就是new一个ArrayList时,长度默认初始化为10.
【2】DK1.8中的ArrayList底层
- 最主要的是:在JDK1.8中newArrayList时,会给出一个空的数组,当调用add方法时,这时候才会把数组的长度设置为10,要是满了,会自动扩容。
课堂问答1: 在 JDK1.7和 JDK1.8中创建ArrayList的时候两个版本之间有何不同?
答:
- JDK1.7:只要newArrayList时,就会给数组默认值为10,这样其实没必要,浪费资源,影响性能。
- JDK1.8:newArrayList时候会给出一个空的数组,但是当调用add方法时,这时才会给出长度为10的数组。
课堂问答2:在集合中的ArrayList实现类和Vector实现类有什么区别?
答:
- ArrayList:底层在扩容的时候是原数组的1.5倍;
- Vector:底层在扩容的时候是元素组的2倍;
- ArrayList:中的add方法线程不安全但是效率高;
- Vector:中的add方法使用关键字synchronized进行修饰,线程安全效率低。



