Java中常用到的几种数据结构 Queue, List ,ArrayList

队列 Queue接口转自 https://www.cnblogs.com/be-forward-to-help-others/p/6825738.html
Java中的Queue是接口(所以 不可以 new Queue<...>()来创建),这个接口的实现有两个常见的类来实现。

Java 队列 queue的一些操作,
    add        增加一个元索                     如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常
  element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常
  offer       添加一个元素并返回true       如果队列已满,则返回false
  poll         移除并返问队列头部的元素    如果队列为空,则返回null
  peek       返回队列头部的元素             如果队列为空,则返回null
  put         添加一个元素                      如果队列满,则阻塞
  take        移除并返回队列头部的元素     如果队列为空,则阻塞

Queue接口中定义了几种方法(也是为什么下面两种类可以有这些操作)
  1. void add(Object e);     //将指定元素加入此队列的尾部。
  2. Object element();       //获取队列头部的元素,但是不删除该元素。
  3. boolean offer(Object e); //将指定元素加入此队列的尾部。当使用有容量限制的队列时,此方法通常比add(Object e)方法更好。
  4. Object peek();           //获取队列头部的元素,但是不删除该元素,如果此队列为空,则返回null。
  5. Object poll();                //获取队列头部的元素,并删除该元素,如果此队列为空,则返回null。
  6. Object remove();      //获取队列头部的元素,并删除该元素

1.LinkedList :(链表)这是一个多功能实现的类,

import java.util.Queue;//先进先出的辅助队列
import java.util.LinkedList;
Queue queue = new LinkedList();

是List接口的集合,可以根据索引值随意访问list中的元素。还实现了Deque接口(Queue的子接口,代表双向队列),Deque中也定义了一些双向操作队列的方法。 还可以用作栈,因为有 pop()和 push() 两个方法。

  1. 如果需要遍历List集合元素,对于ArrayList、Vector集合,则应该使用随机访问方法(get)来遍历集合元素,这样性能更好,对于LinkedList集合,则应该采用迭代器(Iterater)来遍历集合元素。
  2. 如果需要经常执行插入、删除操作来改变List集合大小,则应该使用LinkedList集合,而不是ArrayList。使用ArrayList、Vector集合将需要经常重新分配内存数组的大小,其时间开销往往是使用LinkedList时时间开销的几十倍,效果很差
  3. 如果有多条线程需要同时访问List集合中的元素,可以考虑使用Vector这个同步实现


2.PriorityQueue

是标准的队列实现类(但并不标准),PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序当调用peek方法 或者poll方法来取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。

事实上,PriorityQueue类已经违反了队列,先入先出的基本原则。PriorityQueue不允许插入null元素,它还需要对队列元素进行排序,队列元素有两种排序方式:自然排序、定制排序; 

List接口

ArrayList, LinkedList ,Vector是List接口实现的一个类。接口不可以被构造(不可实例化),但是可以为接口创建一个指向自己的对象引用。

List是继承于Collection接口,除了Collection通用的方法以外,扩展了部分只属于List的方法。

Java中常用到的几种数据结构 Queue, List ,ArrayList_第1张图片


ArrayList类

ArrayList是List接口的一个实现类,是动态数组的类,可以灵活设置数组的大小。查询快,中间插入、删除元素很慢。

import java.util.ArrayList;
ArrayList List = new ArrayList(); 

List list=new ArrayList();
    list.add("保护环境");     //向列表中添加数据

ArrayList a;ArrayList b;a.addAll(b); //将两个Array合并到一个;

ArrayList res  =  new ArrayList() ;
         HashSet set =  new HashSet();
        {......}
         res.addAll(set);
        Collections.sort(res);

addAll()方法 用于将指定 collection 中的所有元素添加到列表。跟上面的Collections.sort(res);保持一致了
 
  

ArrayList的一些操作(类中固有定义的几种方法)

add(element); // ArrayList中增加函数,将元素放在list的末尾。

set(index,element);//会先做index检查,然后将index位置替换为element,并返回原来index出的对象。 get(index); //先做index是否越界检查,然后返回index处的对象。 remove(index); //去掉index 位置的对象,在方法中还有 后面对象前移的过程,所以说效率会打折扣

(无法确定数组大小时,才用这个,因为数组扩容会大大影响此类的效率)

每当执行Add、AddRange、Insert、InsertRange等添加元素的方法,都会检查内部数组的容量是否不够了,如果是,它就会以当前容量的两倍来重新构建一个数组,将旧元素Copy到新数组中,然后丢弃旧数组,在这个临界点的扩容操作,应该来说是比较影响效率的。

ArrayList 的初始化

执行new 关键字时,在堆内存开辟了一块空间。【常量池位于方法区,方法区位于堆内存

构造函数的底层是Object[] 数组,该数组可以存放任何对象(参考 http://www.importnew.com/27075.html)





你可能感兴趣的:(Java中常用到的几种数据结构 Queue, List ,ArrayList)