【问题标题】:Java Stack push() vs add()Java 堆栈 push() 与 add()
【发布时间】:2013-04-06 00:58:04
【问题描述】:

我正在尝试使用Stack,但我对术语有些困惑。

根据 Java 文档,我发现 Stack 类只有 push(E e)

并且具有add(E e)addAll(Collection<? extends E> c) 作为从Vector 类继承的方法。

它们是否具有相同的功能,还是使用push(...)Stack 对象插入元素更好。

换句话说,如果我使用add(...) 而不是push(...),我会遇到什么问题吗?

【问题讨论】:

  • 这些是不再使用的遗留类。你想做什么?
  • Vector 扩展的不幸副作用,不应该这样做。

标签: java collections interface stack


【解决方案1】:

卡利亚纳拉曼·桑塔南:

编辑:如果我使用 add(...) 而不是 推(...)?

当然,您不会遇到任何问题,因为addList 接口以及Stack 的一部分,但是您应该注意您的代码的进一步可读性以及其他程序员的意图. push 方法会给他们一个线索,告诉他们他们正在使用 Stack 对象,他们肯定会知道会发生什么。还要注意push 的返回值与add 不同(前者具有“推送对象”类型,而后者只是boolean 响应)

【讨论】:

  • 示例:Deque 接口具有void addFirst(E e);void push(E e);,它们的行为相似,包括返回类型。从 java 文档中它说

    此方法等效于 {@link #addFirst}。

【解决方案2】:

它们是一样的。

来自JavaDoc

将一个项目推到此堆栈的顶部。这完全一样 效果为:

addElement(item)

【讨论】:

  • 但是 addElement() 和 add() 不是两个不同的函数吗?
【解决方案3】:

(对不起,如果我的英语不好,我来自 MX)。

理论上是一样的,因为add是所有泛型类的方法...但是非常推荐使用push,因为你使用的是堆栈,如果你使用“push”方法而不是“add” ,也许你会明白一点……

【讨论】:

    【解决方案4】:

    如果您使用Stack,那么您应该使用push(),因为这是将元素添加到堆栈的标准方法(由于Stack 的数据结构的想法)。这意味着“堆栈顶部”是您刚刚push()ed 的项目。

    您应该只在 Stack 的顶部添加和删除,如果您认为需要其他方式来添加数据(添加到中间或末尾),那么我建议您不要使用 Stack,因为它会让你的代码更难理解。

    编辑:(反映问题编辑) 正如我所提到的,如果我正在处理Stack,我不会期望看到add()add() 不是使用Stack 的标准语法,push() 是。我建议只使用在javadoc 的主体中定义的函数,除非您特别需要那些被继承的函数。

    【讨论】:

      【解决方案5】:

      唯一的区别是返回类型

      System.out.println(stack.push("1"));
      
      Output : 1
      
      System.out.println(stack.add("2"));
      
      Output : true
      

      但建议栈使用Push方式

      【讨论】:

        【解决方案6】:

        这都是关于继承问题,如果是Stack,你应该使用push() 来明确并遵循模型。但是,实际上来自 Java SE 规范:

        将一个项目推入此堆栈的顶部。这与以下效果完全相同:addElement(item)

        【讨论】:

          【解决方案7】:

          正如大家所说,它与“推”有相同的效果。有人可能会问,但为什么呢?我最近读了这个主题,它说它违反了“最小惊讶原则”的原则。所以这就像 API 的设计缺陷,而不是大问题。这告诉我们,没有任何软件、框架、API 等是完美的,一切都有自己的缺陷。

          【讨论】:

            【解决方案8】:

            是的,push() 和 add() 方法在使用上没有太大区别。但是在使用 Stack 时更喜欢使用 push()

            【讨论】:

              【解决方案9】:

              我最近在尝试编码问题时遇到的情况(实际上是导致我搜索相同问题的情况)是: 当我使用 stack.add(string object) 时,我的代码超出了时间限制。 当我将 .add 更改为 .push 时它成功解决 即 stack.push(字符串对象)。 从字面上看,我没有改变其他任何东西(除了 .add -> .push),并且我的代码及时执行!

              【讨论】:

                【解决方案10】:

                根据我的分析,我发现 add 和 push 方法的输出没有区别。请参考下面的代码和输出..

                导入 java.util.Stack; 公共类 StackDemo { 静态堆栈堆栈=新堆栈(); 公共静态无效主要(字符串[]参数){ // TODO 自动生成的方法存根 添加(10); 添加(20); 添加(30); 打印(); 推(40); 打印(); 流行音乐(); 打印(); 推(50); 打印(); } 静态无效打印(){ System.out.println(stack); } 静态无效添加(int item){ stack.add(项目); } 静态无效推送(int item){ stack.push(项目); } 静态无效窥视(){ System.out.println(stack.peek()); } 静态 int pop() { 返回栈.pop(); } }
                *
                [10, 20, 30]
                [10, 20, 30, 40]
                [10, 20, 30]
                [10, 20, 30, 50]
                *
                

                【讨论】:

                  猜你喜欢
                  • 2014-11-29
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-07-06
                  • 2014-06-23
                  • 1970-01-01
                  • 2016-08-16
                  • 2012-05-28
                  • 2011-05-04
                  相关资源
                  最近更新 更多