代码之家  ›  专栏  ›  技术社区  ›  Finbarr

Java中的添加和提供方法之间的区别是什么?

  •  97
  • Finbarr  · 技术社区  · 15 年前

    PriorityQueue 例如 http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html#offer(E)

    有谁能给我举个例子 Queue 何处 add offer 方法不同吗?

    根据 Collection 博士 添加 方法通常寻求确保元素存在于 收藏 而不是添加重复项。所以我的问题是 添加 提供 方法?

    是那个 提供 方法将不考虑是否添加重复项?(我怀疑这是因为如果 收藏 只应该有不同的元素,这样就可以避免这种情况)。

    编辑: 在一个 优先权队列 这个 添加 提供 方法是相同的方法(见下面我的回答)。有谁能给我举个例子 添加 提供 方法不同吗?

    8 回复  |  直到 6 年前
        1
  •  133
  •   Roy Hvaara    9 年前

    我想区别在于契约中,当元素不能添加到集合时 add 方法引发异常并 offer 不。

    来自: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collection.html#add%28E%29

    如果集合拒绝添加 任何原因的特定元素 除此之外它已经包含 元素,它 必须投掷 安 异常(而不是返回 假)。这将保持不变 集合总是包含 此调用后指定的元素 返回。

    来自: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Queue.html#offer%28E%29

    将指定元素插入 如果可能的话,这个队列。使用时 可能强制插入的队列 限制(例如容量 边界),方法提供通常是 优于方法 collection.add(e),可能无法 只通过抛出 例外。

        2
  •  23
  •   Peter Lang    15 年前

    执行 PriorityQueue.add :

    public boolean add(E e) {
        return offer(e);
    }
    

    对于 AbstractQueue 实际上有一个区别:

    public boolean add(E e) {
        if (offer(e))
            return true;
        else
            throw new IllegalStateException("Queue full");
    }
    
        3
  •  11
  •   Stephen C    15 年前

    两者的区别 offer add 以下是javadocs的两个摘录:

    Collection 接口:

    如果收藏拒绝 添加 一个特定的元素由于任何原因,除了它已经包含该元素之外,它必须抛出一个异常(而不是返回false)。这将保留此调用返回后集合始终包含指定元素的不变量。

    Queue 界面

    当使用可能施加插入限制(例如容量限制)的队列时,方法 提供 通常比方法更可取 Collection.add(E) ,它只能通过引发异常才能插入元素。

    PriorityQueue 是一个 排队 不施加任何插入限制的实现。因此 添加 提供 方法具有相同的语义。

    相比之下, ArrayBlockingQueue 是一个实现,其中 提供 添加 行为不同,这取决于队列的实例化方式。

        4
  •  6
  •   Raging Bull    11 年前

    从JDK 7中的源代码开始,如下所示:

    public boolean add(E e) {
        if (offer(e))
            return true;
        else
            throw new IllegalStateException("Queue full");
    }
    

    我们可以很容易地知道,当成功地向队列中添加新元素时,add函数将返回true,但当失败时抛出异常。

        5
  •  4
  •   Peter    10 年前

    这个 Queue 接口指定 add() 会抛出一个 IllegalStateException 如果当前没有可用空间(否则返回 true 同时 offer() 将返回 false 如果由于容量限制而无法插入元素。

    它们在一个 PriorityQueue 是否将此队列指定为无边界,即没有容量限制。在没有能力限制的情况下, 加法() 提供() 表现出同样的行为。

        6
  •  4
  •   Maksym Ovsianikov    6 年前

    区别如下:

    • 提供 方法-尝试将元素添加到队列中,并返回 如果无法添加元素(例如队列已满时),或者 如果元素已添加,并且未引发任何特定异常。

    • 添加 方法-尝试将元素添加到队列中,返回 如果元素已添加,或者如果当前没有可用空间,则引发IllegalStateException。

        7
  •  2
  •   Aslam a    7 年前

    我将为提供方法和Add方法编写Java契约示例代码,展示它们是如何不同的。

    BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
            queue.add("TestQuue1");     
            queue.add("TestQuue2"); 
            queue.add("TestQuue3");  // will throw "java.lang.IllegalStateException: Queue full
    
    BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
            queue.offer("TestQuue1");       
            queue.offer("TestQuue2");   
            queue.offer("TestQuue3"); // will not throw any exception
    
        8
  •  0
  •   Yeshodhan Kulkarni    12 年前

    来源: http://docs.oracle.com/javase/6/docs/api/java/util/Queue.html

    offer方法在可能的情况下插入一个元素,否则返回false。这与collection.add方法不同,后者只能通过引发未经检查的异常才能添加元素。offer方法设计用于故障是正常的而不是异常的情况下,例如,在固定容量(或“有界”)队列中。