【问题标题】:why using stack data structure for storing primitive values instead of linked lists or arrays ? [closed]为什么使用堆栈数据结构来存储原始值而不是链表或数组? [关闭]
【发布时间】:2016-05-10 22:35:18
【问题描述】:

既然 Stacks 在内部使用 Linked Lists / Arrays,为什么 java 不直接将原始值存储在 Linked Lists / Arrays 而不是 Stacks 中?

【问题讨论】:

  • 恐怕真的不清楚你在问什么。我怀疑您可能会混淆“堆栈”(与堆相比的内存区域)和“java.util.Stack”(Java 集合类)。
  • @JonSkeet:但两者都是一样的,对吧?两者都是 FILO。
  • 任何类型的Stack 都是基于LIFO。 Stack 对pushpop 操作有一些策略,保证堆栈为LIFO。在许多情况下,例如解析和计算带有括号的数学语句,堆栈非常有用,因为您无需担心推送和弹出业务的方式。
  • 你提到FILO 先进后出LIFO相同后进先出LIFO更常见.如果您将PushPop 操作留给您的代码并使用List 之类的东西,您应该在您的代码中执行相同的操作。所以不要从头开始重新创建轮子。
  • 就这些抽象术语而言,它们是相同的。在几乎所有其他方面,它们都非常非常不同。

标签: java memory memory-management data-structures stack


【解决方案1】:

关键问题是泛型是一种编译时特性,所有泛型的实现都使用相同的代码,它们都是List<? extends Object>,并且可以转换为这种类型。但是List<int> 不是对象列表,需要根据需要生成它自己的代码(编译器不这样做)。

还要考虑List<Object>List<int> 的父级是什么,它可能是List<*> 或类似具有size() 方法的东西。这意味着向List<object> 添加一个以前没有的父级,并对已经编译的数据类型执行此操作。例如假设您在 JAR 中拥有自己的 Stack 实现,而 JVM 设计者从未见过并且无需重新编译您的 JAR,您现在想要一个 Stack<int>,这是一个以前从未存在过的类,它在哪里?它应该叫什么?如果编译器创建它并且您在一个 JAR 中发布它,但稍后您再次为另一个 JAR 编译它,您将拥有同一个类的两个版本。

这意味着这个类很可能需要在编译时理解javac,但实际上是在运行时按需创建的,以确保有一个最新版本的类。

支持原始泛型并非易事,但可以做到。事实上,他们希望在 Java 10 中做到这一点。

【讨论】:

    【解决方案2】:

    我相信这是一个关于 SO 的好问题。 让我从java.util.Stack 开始,它扩展了Vector,并有一些内部调用Vector 类中定义的方法的方法。 (例如:removeElementAt(..)addElement(..) 等。

    Vector 实现涉及“Array”,正如您所说的那样。(如果您考虑 jdk 版本)

    基本上java.util.Stack 的工作原理是LIFO,这使它成为一个很棒的data structure。 (用简单的pushpop

    现在回到你的问题,为什么 java 不为stack memory 使用数组。让我简要介绍一下堆栈内存

    Stack Memory 包含特定于方法的短期值,以及对heap 中其他对象的引用,这些对象是从threads 使用的方法中引用的。

    如果您考虑您的程序流程,很棒 main() 将首先被调用,所有后续的嵌套方法调用都将紧随其后。如果您只考虑程序流的stack memory 中的方法,这就是stack 的样子:

    main() <----- 1st call
    
    method1() 
    main() <------ 2nd call
    
    method2()
    method1() 
    main()  <------ 3rd call
    

    因此,如果您将程序的所有控制可视化,则应返回main()LIFO 原理当然是最好的选择。当你有一个方便的data structure 来做这件事时,为什么要重新发明轮子并使用Array

    注意:可视化读出 .class 文件的理想选择。

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2016-02-16
      • 2020-09-13
      • 2013-03-11
      • 2020-11-08
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      • 2020-09-18
      相关资源
      最近更新 更多