本文共 7233 字,大约阅读时间需要 24 分钟。
有序:有序(元素存入集合的顺序和取出的顺序一致)。List 中每个元素都有索引标记。可以根据元素的索引标记(在 List 中的位置)访问元素,从而精确控制这些元素。
可重复:List 允许加入重复的元素。更确切地讲,List 通常允许满足 e1.equals(e2) 的元素重复加入容器。除了 Collection 接口中的方法,List 多了一些跟顺序(索引)有关的方法,参见下表:
方法 | 说明 |
---|---|
void add (int index, Object element) | 在指定位置插入元素,以前元素全部后移一位 |
Object set (int index,Object element) | 修改指定位置的元素 |
Object get (int index) | 返回指定位置的元素 |
Object remove (int index) | 删除指定位置的元素,后面元素全部前移一位 |
int indexOf (Object o) | 返回第一个匹配元素的索引,如果没有该元素,返回-1 |
int lastIndexOf (Object o) | 返回最后一个匹配元素的索引,如果没有该元素,返回-1 |
ArrayList 是 List 接口的实现类。是 List 存储特征的具体实现。
ArrayList 底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。//实例化String类型的ArrayList容器//面向接口编程,使用接口实例化对象,可以减少后期对代码的改动Listlist = new ArrayList<>();//添加元素boolean flag = list.add("两只蝴蝶"); // 添加成功返回true,失败返回false//index的数值不能大于元素的个数list.add(1, "老鼠爱大米"); //无返回值list.add("秋天不回来");list.add("求佛");System.out.println(list); //--[两只蝴蝶, 老鼠爱大米, 秋天不回来, 求佛]
//通过索引获取元素System.out.println(list.get(0)); //两只蝴蝶System.out.println(list.get(1)); //老鼠爱大米System.out.println(list.get(2)); //秋天不回来System.out.println(list.get(3)); //求佛
//删除元素String value = list.remove(1); //下标从0开始System.out.println(value); //返回被删除的元素System.out.println(list); //--[两只蝴蝶, 秋天不回来, 求佛]
//判断容器是否为空,空返回true,否则返回falseboolean bool = list.isEmpty();System.out.println(bool);
//判断容器中是否包含某个元素,包含返回true,否则返回falseboolean bool2 = list.contains("两只蝴蝶");System.out.println(bool2);
//查找元素第一次出现的位置,返回索引,元素不存在则返回-1int index = list.indexOf("秋天不回来");System.out.println(index);
//查找元素最后出现的位置,返回索引int index2 = list.lastIndexOf("两只蝴蝶");System.out.println(index2);
//清空容器list.clear();System.out.println(list);
代码如下自取:
import java.util.ArrayList;import java.util.List;public class ArrayListTest01 { public static void main(String[] args) { //实例化String类型的ArrayList容器 //面向接口编程,使用接口实例化对象,可以减少后期对代码的改动 Listlist = new ArrayList<>(); //添加元素 boolean flag = list.add("两只蝴蝶"); // 添加成功返回true,失败返回false //index的数值不能大于元素的个数 list.add(1, "老鼠爱大米"); //无返回值 list.add("秋天不回来"); list.add("求佛"); System.out.println(list); //--[两只蝴蝶, 老鼠爱大米, 秋天不回来, 求佛] System.out.println("------------------------------------------------------------"); //获取元素 System.out.println(list.get(0)); System.out.println(list.get(1)); System.out.println(list.get(2)); System.out.println(list.get(3)); System.out.println("------------------------------------------------------------"); for (int i = 0; i < list.size(); i++) { //size():返回list中元素的个数 System.out.println(list.get(i)); } System.out.println("------------------------------------------------------------"); //增强for循环 for (String s : list) { System.out.println(s); } System.out.println("------------------------------------------------------------"); //替换元素 String str = list.set(1, "老鼠爱吃米"); System.out.println(str); //返回被替换的元素--老鼠爱大米 System.out.println(list); //--[两只蝴蝶, 老鼠爱吃米, 秋天不回来, 求佛] System.out.println("------------------------------------------------------------"); //删除元素 String value = list.remove(1); //下标从0开始 System.out.println(value); //返回被删除的元素 System.out.println(list); //--[两只蝴蝶, 秋天不回来, 求佛] System.out.println("------------------------------------------------------------"); //清空容器// list.clear();// System.out.println(list); System.out.println("------------------------------------------------------------"); //判断容器是否为空,空返回true,否则返回false boolean bool = list.isEmpty(); System.out.println(bool); System.out.println("------------------------------------------------------------"); //判断容器中是否包含某个元素,包含返回true,否则返回false boolean bool2 = list.contains("两只蝴蝶"); System.out.println(bool2); System.out.println("------------------------------------------------------------"); //查找元素第一次出现的位置,返回索引,元素不存在则返回-1 int index = list.indexOf("秋天不回来"); System.out.println(index); //查找元素最后出现的位置,返回索引 int index2 = list.lastIndexOf("两只蝴蝶"); System.out.println(index2); }}
import java.util.ArrayList;import java.util.List;public class ArrayListTest02 { public static void main(String[] args) { //实例化Integer类型的ArrayList容器 Listlist = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); System.out.println(list); //ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer //虽然定义容器的时候规定了元素是Integer类型,但是泛型只在编译时有效,其实容器里存的还是Object类型// Integer[] str = (Integer[])list.toArray(); //报错 //将ArrayList转换为Object类型数组 Object[] arr = list.toArray(); for (Object o: arr) { Integer i = (Integer)o; //可以在迭代的时候对元素进行强制类型转换 System.out.println(i); } }}
import java.util.ArrayList;import java.util.List;public class ArrayListTest03 { public static void main(String[] args) { Listlist = new ArrayList<>(); list.add(1); list.add(2); list.add(3); list.add(4); //将ArrayList转换为指定类型的数组// Integer[] arr = list.toArray(new Integer[list.size()]); Integer[] arr = list.toArray(new Integer[0]); for (Integer i: arr){ System.out.println(i); } }}
import java.util.ArrayList;import java.util.List;public class ArrayListTest04 { public static void main(String[] args) { Listlist1 = new ArrayList<>(); list1.add("a"); list1.add("b"); list1.add("c"); List list2 = new ArrayList<>(); list2.add("c"); list2.add("d"); list2.add("e"); //容器的并集操作 list1.addAll(list2); System.out.println(list1); //[a, b, c, c, d, e] }}
import java.util.ArrayList;import java.util.List;public class ArrayListTest05 { public static void main(String[] args) { Listlist1 = new ArrayList<>(); list1.add("a"); list1.add("b"); list1.add("c"); List list2 = new ArrayList<>(); list2.add("c"); list2.add("d"); list2.add("e"); //容器的交集操作 list1.retainAll(list2); System.out.println(list1); //[c] }}
import java.util.ArrayList;import java.util.List;public class ArrayListTest06 { public static void main(String[] args) { Listlist1 = new ArrayList<>(); list1.add("a"); list1.add("b"); list1.add("c"); List list2 = new ArrayList<>(); list2.add("c"); list2.add("d"); list2.add("e"); //容器的差集操作 list1.removeAll(list2); System.out.println(list1); //[a, b] }}
Vector 底层是用数组实现的,相关的方法都加了同步检查,因此“线程安全,效率低”。比如,indexOf 方法就增加了 synchronized 同步标记。
Vector 的使用与 ArrayList 是相同的,因为他们都实现了 List 接口,对 List 接口中的抽象方法做了具体实现。转载地址:http://bqpli.baihongyu.com/