List
List是有序、可重复的容器
有序:List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素
可重复:List允许加入重复的元素、List通常允许满足e1.equals(e2)的元素重复加入容器
ArrayList
ArrayList底层是用数组实现的。特点:查询效率高,增删效率低,线程不安全,允许null值。但一般使用它
数组长度是有限的,而ArrayList是可以存放任意数量的元素,长度不受限制,那么它是怎么实现的呢?
目前JDK的底层代码是,通过乘以1.5倍的方式,定义一个新的数组,将原来的内容拷贝过来,超出原来内容的数据,放在扩容后的位置中,进行动态扩容
ArrayList扩容源码的简单解析
public class Collection03 {
//测试ArrayList中的 add,remove,clear,contains,size,isEmpty,toArray方法
public static void main(String[] args) {
// Collection是一个接口所以不能实例化,需要一个实现它的子类
Collection<String> c = new ArrayList<String>();
System.out.println("长度为" + c.size());
System.out.println("是否为空" + c.isEmpty());
// 往容器中添加内容
c.add("张三");
c.add("李四");
System.out.println(c);
Object[] obj = c.toArray(); // 转换成数组
System.out.println(obj);
// 只是从容器中移除了这个数据的引用地址,并没有把这个数据删除了
c.remove("张三");
System.out.println(c);
// 判断是否包含某个元素
System.out.println(c.contains("李四"));
// 清空容器中的所有元素
c.clear();
System.out.println(c);
}
}
remove()方法的简单源码解析
ArrayList交集并集示意图
/**
* 测试ArrayList的并集合交集
* @author csx
*
*/
public class Collection04 {
public static void main(String[] args) {
//Collection是一个接口所以不能实例化,需要一个实现它的子类
Collection<Integer> c1 = new ArrayList<Integer>();
c1.add(1);
c1.add(2);
c1.add(3);
Collection<Integer> c2 = new ArrayList<Integer>();
c2.add(1);
c2.add(3);
c2.add(4);
// c1.addAll(c2); //将c2容器中的元素添加到c1容器中
// System.out.println(c1);
//
// c1.removeAll(c2); //将c1、c2中相同的元素,从c1中删除
// System.out.println(c1);
// c1.retainAll(c2);
// System.out.println(c1); //将c1、c2中不同的元素,从c1中删除
System.out.println(c1.contains(c2)); //判断c1是否包含c2中的所有元素
}
}
/**
* 测试ArrayList的跟索引相关的方法
* @author csx
*
*/
public class Collection05 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
list.add("B");
System.out.println(list);
list.add(2, "你好"); //在指定索引位置插入元素
System.out.println(list);
list.set(2, "F"); //替换指定位置的元素
System.out.println(list);
list.remove(2); //删除指定索引位置的元素
System.out.println(list);
System.out.println(list.get(2)); //获取指定位置的元素
System.out.println(list.indexOf("B")); //返回指定元素第一次出现的索引位置,若不存在就返回-1
System.out.println(list.lastIndexOf("B")); //返回指定元素最后一次出现的索引的位置,若不存在就返回-1
}
}
LinkedList
LinkedList底层是用双向链表实现存储,特点:增删效率高,查询效率低,线程不安全,允许null值。
Vector
Vector底层是用数组实现的List,但是相关的方法都添加了同步检查,因此线程安全、效率低,扩容时Vector默认增长一倍。