鱼C论坛

 找回密码
 立即注册
查看: 2815|回复: 1

[学习笔记] Java-020集合框架之List

[复制链接]
发表于 2018-12-26 13:23:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-12-26 22:33 编辑

1、List简介
List接口:
        表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,每一个元素都有它的索引。第一个元素的索引值是0。
4.PNG

实现的类:
有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 为基数。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-5 11:06:39 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表