【问题标题】:questions about dynamic and static in various scenarios(Java)各种场景下的动静问题(Java)
【发布时间】:2014-01-24 07:30:22
【问题描述】:

一段时间以来,我一直对“动态”和“静态”这两个词感到困惑。据我所知,在不同的场景下,它们可能有不同的含义。任何人都可以帮我说清楚。我希望解释将集中在 Java 中。提前致谢!

场景 1:当它们应用于数据结构(如数组)时,这意味着什么?人们通常认为链表是动态的,数组是静态的。为什么?有时数组可以是静态的(在堆栈中)或动态的(在堆中)。为什么会这样?

场景 2:当它们应用于内存时,这意味着什么?为什么栈是静态的,堆是动态的?

场景 3:当它们应用于动态编程时,这意味着什么?有没有这种东西叫静态编程?

【问题讨论】:

    标签: java memory dynamic static


    【解决方案1】:

    场景 1: java中的数组不能增长:如果它们被创建,它们会保持它们的大小,直到它们死亡。另一方面,LinkedList 可以毫不费力地动态添加元素,它的大小不是固定的。如果您将一个元素添加到 ArrayList 并且底层数组已满,则 ArrayList 实际上会将所有元素复制到具有正确大小的新数组中。

    例子:

    int[] ints = new int[4]; //size is known
    
    int[] ints2 = new int[] {1, 2, 3}; //size is known
    

    这样做的原因是,运行时可以为数组分配一块内存。

    场景 2: 假设:您的意思是调用堆栈。 程序的堆在运行时发生变化。您的 java 程序动态创建对象并再次删除它们 - 这事先不知道。 java 编译器和 VM 都知道将来何时创建对象。 另一方面,堆栈在某种程度上是由编译器决定的:编译器生成调用方法的代码,并且他知道他将使用多少内存来调用特定方法。值得一提的是递归方法:编译器生成代码再次调用递归方法,但他不知道多少次。所以堆栈不是严格静态的,它只是提前知道堆栈的变化(将推送和弹出多少项),但实际大小和数据仅在运行时才知道。

    场景 3: 动态编程是一种用于解决一些算法问题的技术。请参阅wikipedia。不,没有静态编程之类的东西。

    【讨论】:

      【解决方案2】:

      看看你在处理java时,一切都是对象,所有的对象都是在运行时动态分配的。

      让我们看看你的场景:

      场景 1:当它们应用于数据结构(如数组)时,这意味着什么?人们通常认为链表是动态的,数组是静态的。为什么?有时数组可以是静态的(在堆栈中)或动态的(在堆中)。为什么会这样?

      在创建数组时查看其他语言,您将编写如下内容:

      int array[10];// allocates space for 10 integers in memory.
      

      上面是静态分配,因为我们明确提到了大小,并且这个大小是在编译期间为数组分配的。

      如果您想动态分配内存,我们可以使用 malloc、calloc 等函数。每当我们创建链表时,我们都会使用这些函数为它们分配内存。

      但在 java 中,数组也是对象。我们使用 new 关键字创建它们。所以这意味着它们是动态分配的。

      现在场景 2:当它们应用于内存时,这意味着什么?为什么栈是静态的,堆是动态的?

      我想我已经在场景 1 的答案中回答了这个问题。

      现在场景 3:当它们应用于动态编程时,这意味着什么?有没有这种东西叫静态编程?

      没有这样的静态编程。取而代之的是静态变量(在 C、C++ 等中)、静态成员(在 java 中)。要了解静态成员是什么,请参阅此链接 static members,最后 动态编程 是一种用于解决复杂问题和算法的技术。

      HTH :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-30
        • 2017-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多