马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 moc 于 2018-12-26 22:33 编辑
1、List简介
List接口:
表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,每一个元素都有它的索引。第一个元素的索引值是0。
实现的类:
有ArrayList、LinkedList、Vector、Stack等。
① ArrayList -------> 基于数组实现的,是一个数组队列。可以动态的增加容量,线程不安全,查询快,增删慢!
② LinkedList ------> 基于链表实现的,是一个双向循环列表。可以被当做堆栈使用,线程不安全,查询慢,增删快!
③ Vector ---------> 基于数组实现的,是一个矢量队列,是线程安全,查询快,增删慢!
④ Stack ---------> 基于数组实现的,是栈,它继承与Vector,特性是FILO(先进后出)!
一般默认使用ArrayList.
2、List的方法
List除了实现了Collection的所有功能还有其特有的方法。
E get(int index) --------------------> 返回列表中指定位置的元素。
E set(int index, E element) ------> 用指定元素替换列表中指定位置的元素。
ListIterator<E> listIterator() -----> 返回此列表元素的列表迭代器。
ListIterator<E> listIterator(int index) -------> 返回列表中元素的列表迭代器,从列表的指定位置开始。
列表迭代器:
该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
特有功能:
Object previous() -------------> 获取上一个元素
boolean hasPrevious() -------> 判断是否有元素
void add(E e) -----------------> 将指定的元素插入列表
注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用。
并发修改异常:
迭代器是依赖于集合而存在的,迭代器迭代集合元素时,集合的中元素发生了变化,而迭代器却不知道,报错。List list = new ArrayList();
list.add("hello"); // 添加元素
list.add("world");
Iterator it = list.iterator(); // 迭代器遍历
while (it.hasNext()) {
String s = (String) it.next();
if ("world".equals(s)) {
list.add("javaee"); // 并发修改异常
}
}
解决办法:
① 迭代器迭代元素,迭代器修改元素ListIterator lit = list.listIterator(); // 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
while (lit.hasNext()) {
String s = (String) lit.next();
if ("world".equals(s)) {
lit.add("javaee");
}
}
② 集合遍历元素,集合修改元素(普通for)for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
if ("world".equals(s)) {
list.add("javaee");
}
}
2、ArrayList
① ArrayList 本质实现方法是用数组!是非同步的!
② 初始化容量 = 10 ,最大容量不会超过 MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8!
③ indexOf和lastIndexOf 查找元素,若元素不存在,则返回-1!
④ 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量:新的容量=“(原始容量x3)/2 ”。
⑤ ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低。
⑥ ArrayList实现java.io.Serializable的方式。当写入到输出流时,先写入“容量”,再依次写入“每一个元素”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。
3、LinkedList
① LinkedList的实现是基于双向循环链表,实现的 List和Deque 接口。
② LinkedList是非线程安全的,只在单线程下适合使用。
③ LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆。
④ 在查找和删除某元素时,都分为该元素为null和不为null两种情况来处理,LinkedList中允许元素为null。
⑤ LinkedList是基于链表实现的,因此插入删除效率高,查找效率低!
LinkedList的特有功能:
A:添加功能
public void addFirst(Object e)
public void addLast(Object e)
B:获取功能
public Object getFirst()
public Obejct getLast()
C:删除功能
public Object removeFirst()
public Object removeLast()
4、Vector
① Vector实际上是通过一个数组去保存数据的。当我们构造Vecotr时;若使用默认构造函数,则Vector的默认容量大小是10。
② 当Vector容量不足以容纳全部元素时,Vector的容量会增加。若容量增加系数 大于0,则将容量的值增加“容量增加系数”;否则,将容量大小增加一倍。
③ 查找给定元素索引值等的方法中,源码都将该元素的值分为null和不为null两种情况处理,Vector中也允许元素为null。
④ Vector很多地方都与ArrayList实现大同小异,现在已经基本不再使用。
5、Stack
它继承自Vector,那么它的实现原理是以数组实现堆栈的。如果要以链表方式实现堆栈可以使用LinkedList!
boolean empty() ----------> 测试堆栈是否为空。
E peek() -----------------> 查看堆栈顶部的对象,但不从堆栈中移除它。
E pop() -------------------> 移除堆栈顶部的对象,并作为此函数的值返回该对象。
E push(E item) ----------> 把项压入堆栈顶部。
int search(Object o) ------> 返回对象在堆栈中的位置,以 1 为基数。 |