Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么堆栈使用java集合的列表接口_Java - Fatal编程技术网

为什么堆栈使用java集合的列表接口

为什么堆栈使用java集合的列表接口,java,Java,堆栈的这种定义属性称为“后进先出”或后进先出 考虑下面的代码片段 Stack<String> theStack = new Stack<String>(); theStack.push ("A"); theStack.push ("B"); theStack.push ("C"); theStack.remove (1); // removes B 产生输出 System.out.println(theStack); [A, C] 由于堆栈是列表界面的一部分

堆栈的这种定义属性称为“后进先出”或后进先出

考虑下面的代码片段

Stack<String> theStack = new Stack<String>();
theStack.push ("A");
theStack.push ("B");
theStack.push ("C");
theStack.remove  (1);    // removes B
产生输出

System.out.println(theStack);
[A, C]
由于堆栈是列表界面的一部分,因此可以使用删除方法

“因此它违反了堆栈的后进先出属性”


这是在Java收集框架中专门设计的吗?

如果
堆栈
实现
列表,它在很多方面都很有用:这意味着它可以在需要
列表的地方使用

但是,如果您将其用作堆栈,那么您必须对其执行合理的堆栈式操作,这包括不要随意从中间拉出东西

这并不意味着它是后进先出队列的一个糟糕的实现,它只是意味着你必须小心地以后进先出的方式使用它


(这就是说,使用
Stack.remove()。例如,队列是FIFO,但它是由LinkedList实现的(因为链表实现了队列接口),所以您可以执行您不希望队列执行的操作(如从指定位置删除元素、空插入等)。如果要创建用于严格定义算法操作的API,则:
1.创建您自己的类并通过java类支持它们
2.编码时要注意,不要调用不相关的方法。

这是Java如何将其集合设置为List、set和Map的结果。堆栈是一个实现对列表元素的有限访问的列表。类不一定需要设计为防止“滥用”它的“纯”目的。在某些情况下,拥有一个堆栈是很方便的,但是能够“巧妙地”添加或删除顶部下方的条目也是很方便的。另外,可以方便地重用显示和调试列表的工具,以显示/调试堆栈。如果你不认为应该使用删除方法,就不要使用它。我同意你的说法。他们应该使用列表(组合),而不是扩展列表/向量
堆栈
是一个旧类,创建时没有
列表
接口。这似乎是一个错误,而不是一个设计。在OOP开始时,固有性通常用于从其他类获取特性。然而,这被证明是错误的。我仍然不相信:),当remove方法被重写时抛出异常不是一个好方法吗,比如非法操作(类似的情况)?@zerocool是的,我同意这样做是有意义的。我认为它应该使用列表,而不是从列表继承来的。@Chip--好的,你们是对的——他们根本就不应该实现堆栈——若你们想要它,那个就自己实现吧。毕竟,它很容易实现——您只需获取一个列表,并使用
push
pop
…@交叉安全性将其包装起来,这其实很奇怪。从设计的角度来看,如果一个类实现了一个接口,那么它必须实现所有的方法;如果其中一个方法不受支持,那么如果它抛出异常,那么设计就会违反Liskov的替换原则。想想正在处理接口抽象的客户机,突然让他们惊讶的是,实现接口的类不支持它的一个功能!?队列是一个接口,而不是堆栈。LinkedList允许更多的操作,因为它实现了多个接口。是的,但我指的是有关算法设计的集合行为的一般事实。如果您将队列作为参数,则只能调用由队列定义的方法。Stack类型的参数不能限制为堆栈的方法。Queue是一个接口,其操作取决于的实现类,例如LinkedList允许空插入,但ArrayDesk将抛出NullPointerException。允许空与LIFO/FIFO无关。