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中可以存放重复元素,也可 ...
随机推荐
- Ink 和 TravisCI 更配哦
前言 去年还是前年,无意间接触到ink,看到是用go写的,非常小巧和精简,于是乎fork了下,还整了个供ink用的docker镜像``. 不过那时候热衷于折腾博客...结果也没折腾出什么来, 今天整理 ...
- Cannot attach the file *.mdf as database
使用ASP.NET MVC 4 和 Entity Framwork 6(Code First)爬的一个坑,无意间把App_Data下的*.mdf文件删除了,然后程序编译正常,但是运行异常RT,留爪. ...
- 扫盲ASM
在进行程序跟踪时,会出现汇编.由于ASM盲,所以添加不少烦恼.有烦恼得想办法解决.对,扫盲ASM. 这里是教材,感觉大白话很好理解(感谢 http://www.ruanyifeng.com/blog/ ...
- Java连接Redis常用操作
1.去重 package Data; import redis.clients.jedis.Jedis; public class TestRedisUniq { public static Jedi ...
- nim 语言使用 concept 实现 c# 的interface
nim简介 nim语言兼顾C#等高级语言语义表达的丰富性,又有 C 语言的灵活性,以及超强的性能.下面是中文站对他的总结,我抄下来: Nim 是一种静态类型的.编译型.系统编程语言.它结合了其他成熟语 ...
- AutoFac(五)——通过lambda表达式灵活注册
按参数值不同实现不同的注册 一.定义接口 public interface InterfaceDao { public virtual void DoSomething(string type) { ...
- 【笔记】libpcap安装与使用
Ubuntu 20.04. 文章目录 起步 一.下载libpcap 库 二.安装 三.使用 完整程序 (们) 1. 头文件集锦 myheader.h 2. 打印报文内容 sniff.c 3. 嗅探与伪 ...
- 【安装】各平台下安装低版本CUDA的PyTorch
目前直接点开官网,看到的安装链接是这样的: 倘若你的系统的CUDA版本恰好是11.2,而且又懒得升级,可以采取指定版本安装的方式装PyTorch: 运行指令,查看自己的显卡的版本号: nvidia-s ...
- vue3 基础-列表渲染
本篇讲列表渲染, 主要是对 v-on 指令配合 v-if 和一些数组相关的方法来体验 vue 的模板渲染方法. 数组元素的渲染 <!DOCTYPE html> <html lang= ...
- MongoDB从入门到实战之Windows快速安装MongoDB
前言 本章节的主要内容是在 Windows 系统下快速安装 MongoDB 并使用 Navicat 工具快速连接. MongoDB从入门到实战之MongoDB简介 MongoDB从入门到实战之Mong ...