Collection 表示一组对象,它是集中、收集的意思。Collection接口的两个子接口是List、Set接口。由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有Collection的方法:
List是一个接口,而ArrayList是List接口的一个实现类。 ArrayList类继承并实现了List接口。
因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。
List是有序、可重复的容器。
有序:List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。
可重复:List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2) 的元素重复加入容器。
List接口常用的实现类有3个:ArrayList、LinkedList和Vector。
常用方法举例:
package cn.sxt.collection; import java.util.*; public class TestList1 { public static void main(String[] args) { Collection<String> c = new ArrayList<String>(); System.out.println("元素个数:"+c.size());//返回元素的个数 System.out.println("是否为空:"+c.isEmpty());//判断是否为空 c.add("再过几天"); c.add("她就回来了"); System.out.println(c); //测试是否包含某元素 System.out.println("她:"+c.contains("她")); System.out.println("她就回来了:"+c.contains("她就回来了")); Object[] obj = c.toArray();//转换成Object数组 System.out.println(obj); c.remove("她就回来了"); //并不是删除,而是移除 System.out.println(c); c.clear(); //移除全部的内容 System.out.println("当前元素个数:"+c.size()); } }两个list之间操作:
public static void test() { List<String> list = new ArrayList<>(); list.add("女朋友"); list.add("过几天"); list.add("回国了"); List<String> list1 = new ArrayList<>(); list1.add("我要"); list1.add("早点见到"); list1.add("女朋友"); System.out.println("01:"+list); list.addAll(list1); //将集合list1中的元素全部加到list中 System.out.println("02:"+list); list.removeAll(list1);//在list中移除与list2相同部分 System.out.println("03:"+list); list.retainAll(list1);//取相同部分 System.out.println("04:"+list); }List中操作索引的常用方法
public class TestList { public static void main(String[] args) { test03(); } /** * 测试List中关于索引操作的方法 */ public static void test03() { List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); System.out.println(list); // [A, B, C, D] list.add(2, "高"); System.out.println(list); // [A, B, 高, C, D] list.remove(2); System.out.println(list); // [A, B, C, D] list.set(2, "c"); System.out.println(list); // [A, B, c, D] System.out.println(list.get(1)); // 返回:B list.add("B"); System.out.println(list); // [A, B, c, D, B] System.out.println(list.indexOf("B")); // 1 从头到尾找到第一个"B" System.out.println(list.lastIndexOf("B")); // 4 从尾到头找到第一个"B" } }ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。我们一般使用它。
我们知道,数组长度是有限的,而ArrayList是可以存放任意数量的对象,长度不受限制,那么它是怎么实现的呢?本质上就是通过定义新的更大的数组,将旧数组中的内容拷贝到新数组,来实现扩容。 ArrayList的Object数组初始化长度为10,如果我们存储满了这个数组,需要存储第11个对象,就会定义新的长度更大的数组,并将原数组内容和新的元素一起加入到新数组中,扩展后数量为前一个1.5倍,例如初始为10,扩展一次后变为15个,再扩展一次变为22个(22.5向下取整)。