【问题标题】:What is the difference between getFirst() and peekFirst() in Java's LinkedList?Java 的 LinkedList 中的 getFirst() 和 peekFirst() 有什么区别?
【发布时间】:2014-07-18 15:17:12
【问题描述】:

在 Java 的 LinkedList 实现中,我看到两种在我看来功能相同的方法。

getFirst() -- 返回此列表中的第一个元素。

peekFirst() -- 检索但不删除此列表的第一个元素,如果此列表为空,则返回 null。

它们都获得了指向 LinkedList 中第一个元素的指针,而不对其进行任何更改。那么,有什么区别呢?

我看到的唯一区别是,如果列表为空,peekFirst 会返回 null,如果列表为空,getFirst 会抛出 NoSuchElementException。这样的设计模式有什么用?

【问题讨论】:

  • 你介意我把标题改成“Java 的 LinkedList 中的 getFirst() 和 peekFirst() 有什么区别吗?”你所拥有的有点模糊(听起来你在谈论标题中的所有方法,从标题中并不清楚你到底在问什么)
  • @DennisMeng 当然可以。
  • 这个问题实际上是关于DequeLinkedList 实现)而不是直接LinkedList

标签: java linked-list


【解决方案1】:

LinkedList 是一个双端队列。 Deque API 定义了两种形式的方法:一种在操作失败时抛出异常,另一种返回特殊值(null 或 false,取决于操作)。

【讨论】:

    【解决方案2】:

    只有一个共鸣: 1) 减少开发过程中的异常处理

     public E peekFirst() {
         if (size==0)
            return null;
    
         return getFirst();
     }
    

    上面是peekFirst()的实现,它只是检查大小为零,并返回NULL而不是抛出异常

    【讨论】:

      【解决方案3】:

      Java 在 1.2 版本中引入了LinkedList。这是提供getFirst 方法的时候。此消息在列表为空时抛出NoSuchElementException,导致程序员在调用前进行额外检查:

      Element e = null;
      if (!myList.isEmpty()) {
           e = myList.getFirst();
      }
      

      这是一个不便之处,已在 Java 1.6 版中通过添加peekFirst 方法和Dequeue<T> 接口的其他方法来修复。

      【讨论】:

      • 难道我们还不需要在结果中检查 null 吗?我们不是在通话之前执行此操作,而是在通话之后执行此操作。
      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      • 2022-12-04
      • 2011-11-23
      相关资源
      最近更新 更多