来源:
声明:如果我侵犯了任何人的权利,请联系我,我会删除
欢迎高手来喷我
ArrayList中set(index,object)与add(index,object)
set:将原来index位置上的object的替换掉
add:将原来index位置上的 向后移动
List list=new ArrayList();
list.add(index,obj);
把第index+1个以及第index+1个以后的元素都往后移一位,类似elementData[i+1]=elementData[i];
然后再把obj放到index的位置。
当然,这个过程需要考虑index的合理性以及是否会溢出等问题。
Stack的empty() 方法和isEmpty()方法
如果数组中不存在任何元素,则返回 true。
如果数组中存在元素,则返回 false。
Stack 继承了 类 java.util.Vector 中的方法
这里是vector中的方法:
这里是Stack的方法:
Stack中的empty()函数会调用vector中的size()函数,再判断是否为空。
总结:应该是没有区别的
双端队列deque使用以及部分原理
参考:https://www.cnblogs.com/denglh/p/7911513.html
import java.util.Deque;
import java.util.LinkedList;
public class DequeTest {
/**
* @param args
*/
public static void main(String[] args) {
Deque<String> deque = new LinkedList<String>();
deque.add("d");
deque.add("e");
deque.add("f");
//从队首取出元素,不会删除
System.out.println("队首取出元素:"+deque.peek());
System.out.println("队列为:"+deque);
//从队首加入元素(队列有容量限制时用,无则用addFirst)
deque.offerFirst("c");
System.out.println("队首加入元素后为:"+deque);
//从队尾加入元素(队列有容量限制时用,无则用addLast)
deque.offerLast("g");
System.out.println("队尾加入元素后为:"+deque);
//队尾加入元素
deque.offer("h");
System.out.println("队尾加入元素后为:"+deque);
//获取并移除队列第一个元素,pollFirst()也是,区别在于队列为空时,removeFirst会抛出NoSuchElementException异常,后者返回null
deque.removeFirst();
System.out.println("获取并移除队列第一个元素后为:"+deque);
//获取并移除队列第一个元素,此方法与pollLast 唯一区别在于队列为空时,removeLast会抛出NoSuchElementException异常,后者返回null
deque.removeLast();
System.out.println("获取并移除队列最后一个元素后为:"+deque);
//获取队列第一个元素.此方法与 peekFirst 唯一的不同在于:如果此双端队列为空,它将抛出NoSuchElementException,后者返回null
System.out.println("获取队列第一个元素为:"+deque.getFirst());
System.out.println("获取队列第一个元素后为:"+deque);
//获取队列最后一个元素.此方法与 peekLast 唯一的不同在于:如果此双端队列为空,它将抛出NoSuchElementException,后者返回null
System.out.println("获取队列最后一个元素为:"+deque.getLast());
System.out.println("获取队列第一个元素后为:"+deque);
//循环获取元素并在队列移除元素
while(deque.size()>0){
System.out.println("获取元素为:"+ deque.pop()+" 并删除");
}
System.out.println("队列为:"+deque);
}
}
输出
队首取出元素:d
队列为:[d, e, f]
队首加入元素后为:[c, d, e, f]
队尾加入元素后为:[c, d, e, f, g]
队尾加入元素后为:[c, d, e, f, g, h]
获取并移除队列第一个元素后为:[d, e, f, g, h]
获取并移除队列最后一个元素后为:[d, e, f, g]
获取队列第一个元素为:d
获取队列第一个元素后为:[d, e, f, g]
获取队列最后一个元素为:g
获取队列第一个元素后为:[d, e, f, g]
获取元素为:d 并删除
获取元素为:e 并删除
获取元素为:f 并删除
获取元素为:g 并删除
队列为:[]
继承关系是:deque => queue => collection=》Iterable
1.使用队列的时候,new LinkedList的时候为什么用deque接收,不用LinkedList呢?
答:deque继承queue接口,因为它有两个实现,LinkedList与ArrayDeque。用deque接收是因为向上转型(子类往父类转,会丢失子类的特殊功能)了。可以试试,用get()方法,LinkedList接收才有。
2.为什么有一个实现还不够,还弄两个呢,它们总有区别吧?
答:ArrayDeque是基于头尾指针来实现的Deque,意味着不能访问除第一个和最后一个元素。想访问得用迭代器,可以正反迭代。
ArrayDeque一般优于链表队列/双端队列,有限数量的垃圾产生(旧数组将被丢弃在扩展),建议使用deque,ArrayDeque优先。