Java SE 044 使用LinkedList实现Stack与Queue
1.LinkedList与ArrayList
(1)LinkedList的add方法底层是将一个Entry类型的数据存放进去,即包含一个前驱地址引用、后继地址引用以及数据对象的地址引用。
(2)对于一个链表来说,它肯定有一个向前的引用,一个向后的引用,还有个数据本身,如果只是将数据放到链表里面了,引用就没有了,就无法找到下一个元素和前一个元素。因此LinkedList在实现的时候,它是在里面生成一个新的Entry这样一个对象,Entry这个类本身包含了三个部分,第一个是向前的引用,第二个是向后的引用,第三个就是数据,数据就是向链表里面增加的数据。它是用这个作为一个Entry类的成员变量,然后构造出来一个Entry对象,将新生成的Entry对象放到LinkedList里面。因此我们执行linkedlist.add(“aaa”),并不是将字符串儿的引用放到了LinkedList链表里面,而是将一个由字符串儿所构造成的Entry对象放到了LinkedList链表里面。
(3)而ArrayList是直接将数据放入到数组里面就可以了。
(4)总结:
当向ArrayList添加一个对象时,实际上就是将该对象放置到了ArrayList底层维护的数组当中,当向LinkedList中添加一个对象时,实际上LinkedList内部会生成一个Entry对象,该Entry对象的结构为:
Entry{
Entry previous;
Object data;
Entry next;
}
其中Object类型的元素element就是我们向LinkedList中所添加的元素,然后Entry又构造好了向前与向后的引用privious,next,最后将生成的这个Entry对象加入到了链表当中。
换句话说:LinkedList维护的是一个一个的Entry对象。
## 2.自定义队列(Queue)
package com.javase.linkedlist;
import java.util.LinkedList;
public class MyQueue {
@SuppressWarnings("unchecked")
private LinkedList list = new LinkedList();
//将元素对象放到队列里面去
@SuppressWarnings("unchecked")
public void put(Object o){
list.addLast(o);
}
//取元素
public Object get(){
Object o = list.getFirst();
list.removeFirst();
return o;
}
public boolean isEmpty(){
return list.isEmpty();
}
public static void main(String[] args) {
MyQueue myQueue = new MyQueue();
myQueue.put(new Integer(1));
myQueue.put(new Integer(2));
myQueue.put(new Integer(3));
System.out.println(myQueue.get());
System.out.println(myQueue.get());
System.out.println(myQueue.get());
System.out.println(myQueue.isEmpty());
}
}