A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓超军 中级黑马   /  2012-7-20 14:13  /  1977 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邓超军 于 2012-7-20 14:18 编辑

我们从API中看到,“public boolean add(E e) 将指定元素插入此双端队列的末尾。”,“public boolean offer(E e) 将指定元素插入此双端队列的末尾。 ”。那么,add方法与offer方法有什么不同呢?
同理,remove和poll方法又有什么区别呢?

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 黄丽慧 于 2012-7-20 14:27 编辑

add 方法和 offer 方法 的区别是:
当队列的容量固定(有界)时, 使用offer 方法,如果插入不成功则返回 false值。而使用add 方法可能无法插入元素,只是抛出一个异常。
而remove() 和poll() 不同的地方是:
当队列为空时:remove() 方法和add的方法一样都会抛出一个异常,而 poll() 方法则返回 null值。
回复 使用道具 举报
add是list的;offer是queue的
add:Inserts the specified element at the specified position in this list
将指定的元素插入到list中指定的的位置。
offer:Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions.
如果在不违反容量限制的情况下,尽可能快的将指定的元素插入到queue中去

java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优
点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用
element()或者peek()方法。值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
以下都是LinkedList中的源码   
public boolean add(E e) {
        addBefore(e, header);
        return true;
    }
        
            public boolean offer(E e) {
              return add(e);
            }
从源码中可以看到
其实add和offer没什么区别,offer底层也是调用的add方法
   --------------------------------
  public E remove() {
        return removeFirst();
    }
                            public E removeFirst() {
                                return remove(header.next);
                                }
                              
                                                                public E next() {
                                                                        checkForComodification();
                                                                        if (nextIndex == size)
                                                                        throw new NoSuchElementException();
                                                                        lastReturned = next;
                                                                        next = next.next;
                                                                        nextIndex++;
                                                                        return lastReturned.element;
                                                                }
                                                        
        
     public E poll() {
        if (size==0)
            return null;
        return removeFirst();
    }
有源码看出:
当链表为空时,poll返回null,remove会抛出异常













评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
看了本篇回复,我惊了。高手这么多,新特性,新接口,源码都出来了!就是一个区别么,都让你们说了,我还说啥...
赶快回去啃笔记去了...
回复 使用道具 举报
add 方法在插入失败的时候会抛出 IllegalStateException 异常
而offer可以通过返回值来判断成功与否
回复 使用道具 举报
张凯 中级黑马 2012-7-20 16:25:22
7#
add方法与offer方法的不同之处是:
你看:
boolean offer(E e)
Inserts the specified element into this queue if it is possible to do so immediately without violating capacity restrictions. When using a capacity-restricted queue, this method is generally preferable to add(E), which can fail to insert an element only by throwing an exception.

它们的区别就是add 方法在插入失败的时候会抛出 IllegalStateException 异常
而offer可以通过返回值来判断成功与否。
同理,remove方法在移除失败的时候会抛出 IllegalStateException 异常
而poll方法可以通过返回值来判断成功与否。
希望可以帮到你。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马