前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础——List接口

Java基础——List接口

作者头像
DannyHoo
发布2018-09-13 12:30:16
6400
发布2018-09-13 12:30:16
举报
文章被收录于专栏:Danny的专栏Danny的专栏
这里写图片描述
这里写图片描述

  如上图:ArrayList, LinkedList, Vector, Stack是List4个常用的实现类。

  ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。

  LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率低。

  Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。

  Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。

ArrayList和Vector


  1、ArrayLIst和Vector封装了一个动态再分配的Object[]数组。

  2、每个ArrayLIst和Vector对象 有一个capacity属性用来表示它们所封装的Object[]数组的长度,当向ArrayLIst和Vector添加元素时,capacity会自动增加。

  如果需向ArrayLIst和Vector添加大量元素时,可使用ensureCapacity方法一次性地增加capacity。

  *void ensureCapacity(int i):把ArrayLIst和Vector的capacity增加i;

  *void trimTOSize():调整ArrayLIst和Vector的capacity为列表当前大小,程序可调用方法来减少ArrayLIst和Vector对象存储空间。

  ArrayList和Vector的区别:

  1、 同步性:Vector是同步的,ArrayList是异步的

  2、 数据增长:从内部实现机制来讲ArrayList和Vector都是使用数组来控制集合中的对象。当你向着两种类型增加元素的时候,如果元素的数目超出了内部数据目前的长度它们都需要扩展内部数据的长度,Vector缺省的情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中国保存大量的数据那么使用Vector有一些优势。

Stack


  它是vector的子类,用于模拟栈这种数据结构,即“后进先出”。进栈出栈的都是Object,因此从栈中取出元素后必须做类型转换,除非你只是使用Object具有的操作。Stack提供了如下方法:

  1、Object peek():返回栈的第一个元素,但并不将该元素出栈。

  2、Object pop():返回栈的第一个元素,并将该元素出栈。

  3、void push(Object item):将一个元素push进栈。

代码语言:javascript
复制
public static void main(String[] args) {
      // TODO Auto-generated method stub
      //新建一个stack集合
      Stack v=new Stack();
      //依次将3个元素push进栈
      v.push("指南");
      v.push("实战");
      v.push("开发");
      System.out.println(v);//输出[指南, 实战, 开发]
      System.out.println(v.peek());//输出:开发
      System.out.println(v);//依然输出[指南, 实战, 开发]
      System.out.println(v.pop());//输出:开发
      System.out.println(v);//输出[指南, 实战]
 }

LinkedList


  LinkedList既实现了List接口,又实现了Deque接口。即可以根据索引来随机访问集合中的元素,而Deque代表一个双向队列。

  Deque接口里定义了一些可以双向操作队列的方法:

  1、void addFirst(Object e):将指定元素插入该双向队列的开头。

  2、void addLast(Object e):将指定元素插入该双向队列的末尾。

  3、Iterator descengingIterator():返回以该双向队列对应的迭代器,该迭代器以逆向顺序来迭代元素。

  4、Object getFirst():获取但不删除双向队列的第一个元素。

  5、Object getLast():获取但不删除双向队列的最后一个元素。

  6、boolean offerFirst(Object e):将指定的元素插入该队列的开头。

  7、boolean offerLast(Object e):将指定的元素插入队列的末尾。

  8、Object peekFirst():获取但不删除该队列的第一个元素,如果队列为空,则返回null。

  9、Object peekLast():获取但不删除该队列的最后一个元素,如果队列为空,则返回null。

  10、Object pollFirst():获取并删除该队列的第一个元素,如果队列为空,则返回null。

  11、Object pollLast():获取并删除该队列的最后一个元素,如果队列为空,则返回null。

  12、Object pop():pop出该队列所表示栈中的第一个元素。

  13、void push z(Object e):将一个元素push进该队列所表示的栈中。

  14、Object removeFirst():获取并删除该队列的第一个元素。

  15、Object removeFirstOccurrence(Object o):删除该队列第一次出现的o对象。

  16、removeLast():获取并删除该队列的最后一个元素。

  17、Object removeLastOccurrence(Object o):删除该队列最后一次出现的o对象。

比较:


  1、LinkedList与ArrayList、Vector的实现机制完全不同,ArrayList、Vector内部以数组的形式来保存集合中的元素,因此随机访问集合元素上有较好的性能

  2、LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合元素时性能差;但插入、删除时性能出色,因为只需改变指针地址即可。

  3、Vector因为实现了线程同步功能,所以各方面性能都有所下降。

  4、对于基于数组的集合,如ArrayList、Vector,其随机访问的速度比使用Iterator迭代访问的性能好,因随机访问会被映射成数组元素的访问。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档