List接口和Deque接口的ArrayList和Vetor,LinkedList及ArrayDeque等实现类
ArrayList和Vetor是List两个典型的实现类。
他们都是基于数组的实现类。内部都封装了一个动态的,允许再分配的Object[]数组。
他两方法基本都相同。除了,ArrayList是线程不安全的类,多个线程访问ArrayList,超过一个修改ArrayList,则必须手动保证ArrayList的同步性。虽然Vetor是线程安全的,但是也不推荐使用。而且用Collections工具类保证线程安全。
值的一提的是Vetor有个子类Stack。模拟了栈这种数据结构。后进先出。进出栈都是Object,取出元素后必须进行类型转换。
有方法:
Object peek()返回栈的第一个元素,不把该元素压出栈
Objject pop() 返回栈的第一个元素,并将该元素压出栈
Void push(Object o)将元素进栈,位于栈顶。
Stack线程安全但是安全性能差,需要用栈的数据结构,推荐使用ArrayDeque(后面提)
ArrayDeque也是List的实现类,也是Deque的实现类
下示例ArrayDeque作为栈使用的用法
package Test01;
import java.util.ArrayDeque;
public class TestDeque {
public static void main(String[] args) {
ArrayDeque a =new ArrayDeque();
ArrayDeque b =new ArrayDeque();
b.push("第一");
b.push("第二");
b.push("第三");
System.out.println(a.peek());
System.out.println(a.pop());
System.out.println("第二次a是"+a);
a.push("第四");
System.out.println(a); //仔细观察顺序
}
}
同时ArrayDeque也是Deque接口的子接口,也能作为双端队列使用,Deque接口定义了双端队列的方法,允许从两端操作队列。
方法(略看一下):
void addFirst(Object o)将指定元素插入双端队列的开头
void addLastObject o)将指定元素插入双端队列的结尾
Iterator descendingiterator返回该双端队列的迭代器,会用逆向顺序迭代该集合元素。
boolean offerFirst(Object o)将指定元素插入双端队列的开头
boolean offerFirst(Object o)将指定元素插入双端队列的结尾
Object getFirst(Object o)获得但不删除该双端队列的第一个元素,
Object getLast(Object o)获得但不删除该双端队列的最后一个元素,
Object peekFirst(Object o)获得但不删除该双端队列的第一个元素,如果是空,返回null
Object peekLast(Object o)获得但不删除该双端队列的最后一个元素,如果是空,返回null
Object pollFirst(Object o)获得且删除该双端队列的第一个元素,如果是空,返回null
Object polLast(Object o)获得且删除该双端队列的最后一个元素,如果是空,返回null
Object pop() (栈方法)等价于Object removeFirst() 移除该双端队列的第一个元素
void push(Object o) (栈方法)等价于void addfirst(Object o) push该双端队列表示的栈的第一个元素
Object removeFirstOccurence(Object o) 删除该双端队列出现的第一个元素
Object removeLastOccurence(Object o) 删除该双端队列出现的最后一个元素
ArrayDeque也是Deque接口的一个典型的实现类。
PriorityQueue是比较标准的队列实现类,
但是注意: 他不是按添加顺序先进先出,会重新排序。因此在peek或poll取出元素时,会取出最小的
package Test01;
import java.util.PriorityQueue;
public class TestPriorityQueue {
public static void main(String[] args) {
PriorityQueue p =new PriorityQueue();
p.offer(6);
p.offer(-3);
p.offer(20);
p.offer(18);
System.out.println(p); //该结果可能看出PriorityQueue没有很好的按从小到大排序,受到toString()返回值影响。
p.poll();
System.out.println(p);
p.poll();
System.out.println(p);
p.poll();
System.out.println(p);
p.poll();
System.out.println(p); //从这可看出仍是从小到大移除元素
}
}
PriorityQueue不允许插入null元素,还需要对队列进行排序。PriorityQueue队列对元素的要求和TreeSet基本一致,也有类似自然排序和定制排序两种。
不能随机访问队列。
固定长度的List
背景知识:有个操作数组的工具类Arrays,这个类有个方法aslist(Object....a)可以把数组和指定个数的对象转为List集合。
注意:这个List集合不是ArrayList实现类的实例,也不是Vetor实现类的实例。是Arrays的内部类ArrayList的实例
package Test01; import java.util.Arrays;
import java.util.List; public class TestAslist {
public static void main(String[] args) {
List<String> fixedList =Arrays.asList("你好啊","天天天蓝");
/* fixedList.forEach(System.out::printIn());
*/
fixedList.add("可以添加吗");
fixedList.remove("可以删除吗");
}
}
运行结果

LinkedList实现类
是List接口的实现类,可以当做List集合,通过索引随机访问集合元素。还实现了Deque接口,可被作为栈也可被作为双端队列使用。
下例子示范了强大功能
package Test01;
import java.util.LinkedList;
public class TestLinkedList {
public static void main(String[] args) {
LinkedList p =new LinkedList();
p.offer("加入队列的尾巴");
p.push("加入栈顶");
p.offerFirst("加入队列的头部");
System.out.println("排序下"+p);
for(int i=0;i<p.size();i++) {
System.out.println(p.get(i));
}
System.out.println(p.peekFirst());
System.out.println(p.peekLast());
p.poll(); //把栈顶元素压出栈
System.out.println(p);
p.pollLast(); //把队列的最后一个元素删除
System.out.println(p);
}
}
注意:
LinkedList与ArrayList及ArrayDeque内部用Object[]数组维护不同,随机访问元素特强。。它是链表维护的,因此随机访问较差,但是插入,
删除性能比较好。虽然Vetor也是内部Object[]维护,但是为了实现线程同步
(实现的机制也不好),所以Vetor各方面都比较差。
对于内部是用数组Object[]维护的ArrayList及ArrayDeque,随机访问效果都比迭代的好。随机访问会被映射为对数组元素的访问。
总结下线性表的性能分析:
List集合是一个线性表接口,LinkedList(基于链的线性表)和ArrayList(基于数组的线性表)又是他的典型实现。Queue表示队列,Deque表示
双端队列(既能作为栈,又能作为队列)。
总体来说,ArrayList性能比LinkedList性能好,所以大多数时候想到ArrayList
对使用List集合的建议:
需要遍历List集合里的元素,对ArrayList和Vetor,用get()访问比较好,对LinkedList,Itertor迭代器访问更好。
如果需要经常插入,删除来改变包含大量数据的List集合的大小,考虑LinkedList,ArrayList和Vetor需要重新分配内部数组的大小,性能较差。
多个线程访问List里的集合,应该用上Collections工具类包装成线程安全的集合。
List接口和Deque接口的ArrayList和Vetor,LinkedList及ArrayDeque等实现类的更多相关文章
- 16、Collection接口及其子接口Set和List(常用类LinkedList,ArrayList,Vector和Stack)
16.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同 ...
- Collection接口的子接口——Deque接口
https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html public interface Deque<E> exten ...
- JAVA中Collection接口和Map接口的主要实现类
Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素 ...
- java比较器Comparable接口和Comaprator接口
Comparable故名思意是比较,意思就是做比较的,然后进行排序. 1.什么是comparable接口 此接口强行对实现它的每个类的对象进行整体排序.此排序被称为该类的自然排序 ,类的 compar ...
- Java中实现对象的比较:Comparable接口和Comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- 源码阅读—Iterator接口和LIstIterator接口
在继续看ArrayList源码之前,先了解Iterator接口和ListIterator接口,下篇文章详细讲解ArrayList是如何实现它们的. 我们知道,接口只是一种规范,当继承接口并实现其中的方 ...
- Java:实现对象的比较 comparable接口和comparator接口
在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中 ...
- Clloection接口 与List接口
collection接口: collection是单列集合接口的根接口,该接口中又包含了多个集合接口,collection接口提供了很多操作集合的方法,比如添加元素的方法,删除元素的方法,修改元素的方 ...
- List接口、Set接口和Map接口
1.List和Set接口继承自Collection接口,而Map不是继承的Collection接口 Map没有继承Collection接口,Map提供key到value的映射;一个Map中不能包含相同 ...
- Java基础-Collection子接口之Set接口
Java基础-Collection子接口之Set接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学习Collection接口时,记得Collection中可以存放重复元素,也可 ...
随机推荐
- 接口中的成员特点、类和接口之间的各种关系--java进阶day02
1.接口的成员特点 1.接口没有构造方法 接口没有构造方法,但是实现类中有构造方法,super()又该访问谁呢? 类实现接口只是认干爹,类本身还是会有亲爹Object,super()会访问Object ...
- 【SpringCloud】Zookeeper服务注册与发现
Zookeeper服务注册与发现 Eureka停止更新了,你怎么办 https://github.com/Netflix/eureka/wiki SpringCloud整合Zookeeper替代Eur ...
- 如何在 Vim 里直接完成 Git 操作?
Vim 是 Linux 下一款很常用的文本编辑器,虽然它对初学者而言并不友好,但通过一些插件的配合,它可以被打造成一款很强大的 IDE .良许曾经介绍过三款很常用的插件,可点击以下链接查看: Vim ...
- FastAPI依赖注入:链式调用与多级参数传递
title: FastAPI依赖注入:链式调用与多级参数传递 date: 2025/04/05 18:43:12 updated: 2025/04/05 18:43:12 author: cmdrag ...
- 本地学习环境minikube安装
有感于K8S太强大和自己的太无知,索性来系统学习下K8S.网上一番攻略,起码先得有个本地学习环境,所以安装一个minikube,下面记录安装过程,供有需要的人使用. 看看minikube架构: 我是在 ...
- 使用Python可视化磁场
引言 随着科学技术的发展,物理学中的很多概念变得越来越复杂,但我们可以利用 Python 这一强大的工具,将一些抽象的物理现象变得更加直观易懂.今天,我们将以"磁场可视化"为主题, ...
- ThreadPoolExecutor的内部类Worker详细解析
一.定义 ThreadPoolExecutor 的内部类 Worker 是线程池的核心实现之一,它封装了线程和任务,并负责执行任务.Worker 类继承自 AbstractQueuedSynchron ...
- InnoDB 的内存结构详情
文章目录 1.更新语句在MySQL中是如何执行的 2.重要的内存结构-Buffer Pool缓冲池 3.undo日志文件如何让更新的数据可以回滚 4.更新Buffer Pool缓冲池中的缓存数据 5. ...
- python爬虫爬取B站视频字幕,简单的数据处理(pandas将字幕写入到CSV文件中)
上文,我们爬取到B站视频的字幕:https://www.cnblogs.com/becks/p/14540355.html 这篇,讲讲怎么把爬到的字幕写到CSV文件中,以便用于后面的分析 本文主要用到 ...
- 【工具】FFmpeg|压缩视频,500MB变25MB(有损,支持 Windows、Linux、macOS 各个平台)
参考: 如何将一分钟长的1080p视频压缩至5MB以内?-知乎-滔滔清风 近期HEVC扩展备用安装方法-B站-悲剧天下 总共三个步骤,安装FFmpeg.运行指令.打开视频. 亲测 500MB 变 25 ...