我一直对“动态”和“静态”这两个词感到困惑。据我所知,在不同的场景中,它们可能有不同的含义。任何人都可以帮我说清楚。我希望这些解释将集中在Java中。提前谢谢!
场景1:当它们应用于数据结构(如数组)时,这意味着什么?人们通常将链表视为动态,将数组视为静态。为什么?有时,数组可以是静态的(堆栈中)或动态的(堆中)。为什么会这样?
场景2:当它们应用于内存时意味着什么?为什么堆栈是静态的,堆是动态的?
场景3:当它们应用于动态编程时,这意味着什么?有没有这样的东西叫静态编程?
答案 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:)