1、 实现List接口的集合类中的元素是有序的,且允许重复。 2、 List集合中的元素都对应一个整数型的序号记载其在集合中的位置(每个元素都有索引),可以根据序号存取集合中的元素。 3、 List集合不仅支持Iterator还支持List集合专用迭代器ListIterator(双向迭代器)
List接口比Collection接口中新增的几个实用方法: 1、 public Object get(int index) 返回列表中的指定位置的的元素 2、 public Object add(int index, Object element); 在列表的指定位置插入指定元素.将当前处于该位置的元素(如果有的话)和所有后续元素向右移动 3、 public Object set(int index, Object new) ; 用指定元素替换列表中指定位置的元素 4、 public Object remove(int index) 移除列表中指定位置的元素 5、 public ListIterator listIterator() 返回此列表元素的列表迭代器(List专有) 注意:list集合中的元素的索引与数组中元素的索引一样,均是从0开始。
ArrayList ArrayList是使用数组结构实现的List集合
优点: 1、 对于使用索引取出元素有较好的效率 //随机读取效率非常高 2、 可以使用索引来快速定位对象 缺点:删除和添加效率极低
ListDemo.java
public class ListDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); List<String> temp = new ArrayList<>(); list.add("小明");// 继承自collection的方法 list.add(0, "老王"); temp.add("aa"); temp.add("bb"); list.addAll(temp); temp.add("cc"); // list.removeAll(temp);// 移除交集 list.retainAll(temp);// 保留交集 // list.set(1, "小绿"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } }Demo2.java
public class Demo2 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); // 双向迭代器 // list.listIterator(1);// 设置迭代器初始位置 ListIterator<String> listIterator = list.listIterator(); while (listIterator.hasNext()) { listIterator.add("rr");// 添加到下一个元素之前 System.out.println(listIterator.next()); } while (listIterator.hasPrevious()) { // 判断前面有没有元素 System.out.println(listIterator.previous()); } } }Demo3.java
public class Demo3 { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); // 对list来说,一般用for循环遍历 for (int i = 0, size = list.size(); i < size; i++) { System.out.println(list.get(i)); } // for each for (String string : list) { System.out.println(string); } String[] arr = new String[list.size()]; String[] arrs = list.toArray(arr); for (String s : arrs) { System.out.println(s); } } }LinkedList LinkedList是使用双向链表实现的集合。该类也实现了Deque双向队列接口。Deque定义了很多操作双向队列的方法。
Vector 在List 接口中还有一个子类:Vector。Vector类从整个 Java 的集合发展历史来看,Vector算是一个元老级的类,在 JDK1.0 的时候就已经存在此类。但是到了Java2(JDK1.2)之后重点强调了集合框架的概念,所以先后定义了很多的新接口(如:List 等)。但是考虑到一大部分的人已经习惯了使用 Vector类,因此设计者就让 Vector 类多实现了一个 List接口,这样才将其保留下来。但是因为其是 List 接口的子类,所以 Vector 类的使用与之前的并没有太大的区别。但是Vector内部有一些比较老的方法名比较长的方法。
Stack
Vector提供一个Stack子类,它用于模拟了“栈”这种数据结构,“栈”通常是指“后进先出”(LIFO)
主要提供了三个方法: pop push peak
StackDemo.java
public class StackDemo { public static void main(String[] args) { Stack<String> stack = new Stack<String>(); // 入栈 stack.push("q"); stack.push("w"); stack.push("e"); stack.push("r"); stack.push("t"); stack.push("y"); for (String s : stack) { System.out.println(s); } // 出栈 String s = stack.pop(); System.out.println(s); for (String ss : stack) { System.out.println(ss); } // peek String peek = stack.peek();// 查看栈顶的元素 System.out.println(peek); } }