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中可以存放重复元素,也可 ...
随机推荐
- 什么是MIME类型-基础知识补全
MIME类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)是一种标准,用于标识互联网上传输的文件类型.它最初是为电子邮件设计的,后来被广泛应用于W ...
- ChirpStack 设备连通性测试极简工具
一.工具简介 你是否为调试 ChirpStack 设备数据连通性而烦恼?是否希望快速验证数据解析逻辑而无需复杂部署?这个 ChirpStack 数据连通性测试工具,算是一个极简解决方案! 无论是 Ch ...
- java基础之函数式接口
一.函数式接口在Java中是指:有且仅有一个抽象方法的接口,所以函数式接口就是可以适用于Lambda使用的接口 二.自定义函数式接口 格式: @FunctionalInterface //该注解可省, ...
- 🎀chrome扩展程序本地打包
简介 本文为Chrome浏览器已安装的扩展程序打包为离线.crx文件,便于在无法访问Chrome商店场景下使用 扩展管理页面 chrome://extensions/ 确定自己需要打包的扩展程序ID ...
- 多线程——ThreadPool
参考:第三节:ThreadPool的线程开启.线程等待.线程池的设置.定时功能 - Yaopengfei - 博客园 (cnblogs.com) C# AppDomain 详解_勇于尝试,却要三思后行 ...
- Weblogic远程代码执行CVE-2023-21839复现及修复
声明:本文分享的安全工具和项目均来源于网络,仅供安全研究与学习之用, 如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关. WebLogic 存在远程代码执行漏洞(CVE ...
- 89.4K star!这个开源LLM应用开发平台,让你轻松构建AI工作流!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 Dify 是一款开源的 LLM 应用开发平台,通过直观的可视化界面整合 AI 工作流.RAG ...
- 流的使用之“如何将List<String>转为Map”
流的使用之"如何将List<String>转为Map" ProductIllegalCustom query = new ProductIllegalCustom(); ...
- AI 狂飙时代,开源项目的新机遇?
我每天都会刷 GitHub 热榜,围观全球开发者们都在捣鼓啥新鲜的玩意儿.我真切地感受到 AI 的浪潮汹涌而至,它正以一种摧枯拉朽(这个词可能有点猛,但感觉就是这么快!)的速度,改变着软件开发行业,同 ...
- 三-select模型
select模型是对简单C/S模型的优化,他解决了accept函数阻塞等待连接的问题.并且允许应用程序同时监视多个套接字,从而实现简单的并发请求.通过调用select函数确认一个或多个套接字当前的状态 ...