前文学习过Collection接口的使用,接下来学习Collection接口的子类,java.util.List和java.util.Map集合。
java.util.List接口继承extends自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
List接口特点:
1.它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33.那么集合中,元素的存储就是按照11、22、33的顺序完成的。
2.它是一个带有索引的集合,通过索引就可以精确地操作集合中的元素(与数组的索引一个道理)。
3.集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
tips:之前学习过List接口的子类java.util.ArrayList类,该类的方法都是来自List中定义。
List常用方法:
注意事项:操作索引的时候,一定要防止索引越界异常。(不要超出索引范围)
public void add(int index,E element):将指定的元素,添加到该集合中的指定位置上。
public E get(int index):返回集合中指定位置的元素。
public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素。
public E set(int index,E element):用指定元素替换集合中指定位置的元素,返回值是更新前的元素。
public static void main(String[] args) { // 多态写法 List<String> list = new ArrayList<>(); // 按顺序添加元素 list.add("aaa"); list.add("bbb"); list.add("ccc"); // 打印集合 System.out.println(list); // [aaa, bbb, ccc] 重写了toString方法 // 按索引添加元素 // public void add(int index,E element):将指定的元素,添加到该集合中的指定位置上。 // 在bbb和ccc之间,添加ddd // 注意不是替换,是先将该索引位置的元素及后面的元素后移,而后插入 list.add(2,"ddd"); System.out.println(list); // [aaa, bbb, ddd, ccc] // public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素。 // 移除ddd元素,注意,此处后续元素也是有前移动作 String str = list.remove(2); System.out.println("被移除的元素:" + str); // 被移除的元素:ddd System.out.println(list); // [aaa, bbb, ccc] // public E set(int index,E element): // 用指定元素替换集合中指定位置的元素,返回值是更新前的元素。 // 将aaa替换为AAA String str1 = list.set(0,"AAA"); System.out.println("被替换的元素:" + str1); // 被替换的元素:aaa System.out.println(list); // [AAA, bbb, ccc] // public E get(int index):返回集合中指定位置的元素。 // List集合遍历有三种方式 // 1.普通的遍历 System.out.println("普通for循环遍历"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } // 2.for each遍历 System.out.println("for each循环遍历"); for (String str2 : list) { System.out.println(str2); } // 3.迭代器遍历 System.out.println("迭代器遍历"); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } }
List子类(实现类)
1.ArrayList集合(前文已介绍),对应数据结构是:动态数组
ArrayList因为存储的地址连续,所以查询效率高,只需要提供索引,时间复杂度为O(1),但是增删需要移动数据,时间复杂度达到了O(n),当程序中需要大量地进行增删数据时,ArrayList数据结构不适合采用。
2.LinkedList
java.util.LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
LinkedList是一个双向链表。
特点:
1.底层是一个链表结构:查询慢,增删快。
2.里边包含了大量操作首尾的方法。
注意:使用了LinkedList集合特有的方法,不能使用多态!
常用方法:
public void addFirst(E e):将指定元素添加到此列表的开头。
public void addLast(E e):将指定元素添加到此列表的结尾。
public E getFirst():返回此列表的第一个元素。
public E getLast():返回此列表的最后一个元素。
public E removeFirst():移除并返回此列表的第一个元素。
public E removeLast():移除并返回此列表的最后一个元素。
public E pop():从此列表所表示的堆栈处弹出一个元素。
public void push(E e):将元素推入此列表所表示的堆栈。
public boolean isEmpty():如果列表不包含元素,则返回true。
/* public E removeFirst():移除并返回此列表的第一个元素。 public E removeLast():移除并返回此列表的最后一个元素。 public E pop():从此列表所表示的堆栈处弹出一个元素。 */ private static void show03() { LinkedList<String> linkedList = new LinkedList<>(); linkedList.add("aaa"); linkedList.add("bbb"); linkedList.add("ccc"); // public E removeFirst():移除并返回此列表的第一个元素。 String removeFirst = linkedList.removeFirst(); System.out.println("被移除的第一个元素:" + removeFirst); // 被移除的第一个元素:aaa System.out.println(linkedList); // [bbb, ccc] // public E removeLast():移除并返回此列表的最后一个元素。 String removeLast = linkedList.removeLast(); System.out.println("被移除的最后一个元素:" + removeLast); // 被移除的最后一个元素:ccc System.out.println(linkedList); // [bbb] // public E pop():从此列表所表示的堆栈处弹出一个元素。 // 此方法相当于removeFirst方法 String pop = linkedList.pop(); System.out.println("从栈顶弹出的元素:" + pop); // bbb System.out.println(linkedList); // } // public E getFirst():返回此列表的第一个元素。 // public E getLast():返回此列表的最后一个元素。 private static void show02() { LinkedList<String> linkedList = new LinkedList<>(); linkedList.add("aaa"); linkedList.add("bbb"); linkedList.add("ccc"); if(!linkedList.isEmpty()) { String first = linkedList.getFirst(); String last = linkedList.getLast(); System.out.println("第一个元素:" + first); // aaa System.out.println("最后一个元素:" + last); // cc } // 清空 linkedList.clear(); System.out.println(linkedList.size()); // 0 } /* public void addFirst(E e):将指定元素添加到此列表的开头。 public void addLast(E e):将指定元素添加到此列表的结尾。 public void push(E e):将元素推入此列表所表示的堆栈。 */ private static void show01() { // 创建LinkedList集合对象,不能使用多态 LinkedList<String> linkedList = new LinkedList<>(); // 使用add方法往集合中添加元素 linkedList.add("aaa"); linkedList.add("bbb"); linkedList.add("ccc"); // 使用addFirst方法往集合开头添加元素 linkedList.addFirst("AAA"); System.out.println(linkedList); // [AAA, aaa, bbb, ccc] // public void push(E e):将元素推入此列表所表示的堆栈。 // 等效于addFirst方法 linkedList.push("111"); System.out.println(linkedList); // [111, AAA, aaa, bbb, ccc] // public void addLast(E e):将指定元素添加到此列表的结尾。 // 此方法等效于add方法 linkedList.addLast("DDD"); System.out.println(linkedList); // [111, AAA, aaa, bbb, ccc, DDD] }
Vector类可以实现可增长的对象数组(底层和ArrayList一样是动态数组),Vector是同步的(单线程的),速度慢。