关于各种场景中的动态和静态的问题(Java)

时间:2014-01-24 07:30:23

标签: java memory dynamic static

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

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

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

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

2 个答案:

答案 0 :(得分:0)

场景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。不,没有静态编程这样的东西。

答案 1 :(得分:0)

当你在使用java时,一切都是对象,所有对象都是在运行时动态分配的。

让我们看看你的情景:

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

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

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

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

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

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

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

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

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

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

HTH:)