Java基础——List接口

  如上图: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进栈。

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迭代访问的性能好,因随机访问会被映射成数组元素的访问。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术专栏

Scala入门与进阶(三)- 函数

默认参数:在函数定义时,允许指定参数的默认值 $SPARK_HOME/conf/spark-defaults.conf

1173
来自专栏算法修养

ZOJ 3932 Deque and Balls

There are n balls, where the i-th ball is labeled as pi. You are going to put n ...

2425
来自专栏石奈子的Java之路

原 JVM基础命令

2787
来自专栏天天

String

671
来自专栏程序你好

如何将Array转换为List?

可以使用 Arrays.asList() 方法, 该方法接受一个数组作为输入,并返回一个列表作为输出。

952
来自专栏从零开始学 Web 前端

从零开始学 Web 之 ES6(二)ES5的一些扩展

打印结果:Obj2下面的__proto__指向的原型对象中有Obj1的属性,相当于继承了Obj1属性。

1075
来自专栏小白的技术客栈

Python基础语法-内置数据结构之元组

今天给大家讲解Python的内置数据结构元组。前面的内容大家有没有复习呢? 元组的特点:不可变的列表,但是可哈希的。列表是不可哈希的。 元组创建及使用 使用()...

36212
来自专栏技术记录

JavaBean转Map方法

Map<String, Object> fieldMap =new HashMap<String, Object>(); BeanInfo beanInfo ...

4066
来自专栏Java学习网

Java面试题系列之基础部分(四)——每天学5个问题

Java基础部分学习的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语法,集合的语法,io的语法,虚拟机方面的语法,这些都是最基...

2488
来自专栏java学习

面试题66(StringBuffer)

面试例题1:对于如下代码,以下哪一个结论是正确的? public class Foo { public static void main(String[] ...

2904

扫码关注云+社区

领取腾讯云代金券