【问题标题】:why the output differs when push() method is used in ArrayDeque and Stack?为什么在 ArrayDeque 和 Stack 中使用 push() 方法时输出不同?
【发布时间】:2018-05-27 16:53:31
【问题描述】:

我是 Java 新手,正在学习集合主题。谁能告诉我为什么在 ArrayDeque 和 Stack 中使用 push 方法时输出会发生变化?

ArrayDeque 示例程序:

public class Simple4 {

public static void main(String[] args) {
    // TODO Auto-generated method stub

ArrayDeque q = new ArrayDeque();

q.push("e");
q.push("f");

System.out.println(q);
}
}

输出: [f, e]

堆栈示例程序:

public class Simple5 {

public static void main(String[] args) {
    // TODO Auto-generated method stub

Stack s = new Stack();
s.push("apple");
s.push("banana");


System.out.println(s);
}
}

输出: [苹果,香蕉]

【问题讨论】:

  • ArrayDeque 迭代器的排序(通过它的 toString() 方法访问是从头到尾(LIFO),使用 pop() 时得到相同的顺序
  • 一般来说,如果您要问为什么两个代码 sn-ps 的行为不同,最好提供相同的输入。在这种情况下,添加相同的列表元素,以使差异可以直接比较。

标签: java stack queue


【解决方案1】:

您的示例是 both 原始类型。不要使用原始类型。此外,您的Stack 正在使用Collection 的默认输出格式 - 请注意元素以 FIFO 顺序(而不是 LIFO)出现。要正确使用Stack,请使用pop()。喜欢,

Stack<String> s = new Stack<>();
s.push("apple");
s.push("banana");
while (!s.isEmpty()) {
    System.out.println(s.pop());
}

哪些输出(在 LIFO 中)像

banana
apple

【讨论】:

    【解决方案2】:

    不要误以为Stack.pushArrayDeque.push 有任何关联。尽管名称和参数相同,但它们彼此无关。

    Stack.push 是在 Stack 类上定义的。

    ArrayDeque.push 实现了Deque.push 方法。但是Stack 不是Deque——你只能在一端穿上和脱下东西,而序列允许你在两端穿上和穿上(“De”的意思是“双端”)。

    由于它们是不相关类上的不相关方法,因此您不应该期望它们做同样的事情。当然,他们可能 - 您需要检查 Javadoc 以了解类的协定是什么 - 根本不应该期望他们 这样做

    【讨论】:

    • 没有解释哪个做什么?您可能应该解释一下区别是什么。
    • @mackycheese21 不,我在最后一段中的观点:当你使用不同的类时,它们会做不同的事情。 需要(/一个需要)阅读 Javadoc 以了解其中的区别。
    • 有人可能会认为注意Stack Javadoc 明确@987654322 提供了一组更完整和一致的 LIFO 堆栈操作会有所帮助@ 接口及其实现,应优先于此类使用。
    猜你喜欢
    • 2017-05-26
    • 2016-08-17
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多