在Java:is";“无效”;阵列坏了吗?

在Java:is";“无效”;阵列坏了吗?,java,arrays,dynamic,Java,Arrays,Dynamic,我正在学习Java,令人惊讶的是,我发现Java数组不是动态的——尽管它的同类语言有动态数组 所以我想出了一些想法,用java自己模拟一个动态数组 我的一个想法是将原始数组引用复制到临时数组,然后将原始数组设置为null,将其索引设置为更大的值,最后从临时数组中重新复制值 例如: if(numberOfEntries == array.length){ Type[] temp = new Type[numberOfEntries]; for(int x=0; x

我正在学习Java,令人惊讶的是,我发现Java数组不是动态的——尽管它的同类语言有动态数组

所以我想出了一些想法,用java自己模拟一个动态数组

我的一个想法是将原始数组引用复制到临时数组,然后将原始数组设置为null,将其索引设置为更大的值,最后从临时数组中重新复制值

例如:

if(numberOfEntries == array.length){
        Type[] temp = new Type[numberOfEntries];
        for(int x=0; x < numberOfEntries; x++){
            temp[x] = array[x];
        }
        array = null;
        array = new Type[numberOfEntries+1];
        for(int x=0; x < numberOfEntries; x++){
            array[x] = temp[x];
        }
if(numberOfEntries==array.length){
类型[]临时=新类型[numberOfEntries];
对于(int x=0;x
我知道,如果进程中断,这可能会导致数据丢失,但除此之外,这是一个坏主意吗?我的选择是什么


谢谢!

你的想法是正确的。但是对于你提出的任务,你不应该实施你自己的版本,除非是出于学术目的和乐趣

您的建议大致由类实现。 这有一个内部数组和一个大小“计数器”。添加项时,内部数组将被填充。当内部数组已满时,所有元素都复制到一个更大的数组中。内部数组永远不会发布给类的用户(以确保其状态始终有效)


在您的示例代码中,因为数组是指针,所以您实际上不需要临时数组。只需创建一个新数组,复制所有元素并将指向它的指针保存为您的数组。

数组不是动态的,它们的大小不能动态更改,而且现在您没有更改相同的对象,而是将较小的对象替换为较大的对象对象

     int[5] Arr = new int[5] ; // Create an array of size 5
     Arr = new int[10] ;// you assigned the different objects. It is not the same object.
因此,我们无法动态更改数组的大小。您可以使用ArrayList进行相同的更改


但是请继续尝试!!!

请查看java.util.ArrayList,它是动态的,它是集合框架的一部分。动态创建数组应该更慢,而且更容易出错。

您可能需要查看。将数组的大小更改为1可能会非常低效。根据您的使用情况,您可能需要加入将数组大小增加一倍,当数组只满四分之一时,同样将数组减半


ArrayList很方便,但一旦它满了,添加一个元素就需要线性时间
method。我建议您更加熟悉Java的集合框架,这样您就可以自己做出未来的最佳决策。

您听说过时间复杂度吗,您知道您增加了多少时间复杂度吗?每次将旧数组元素复制到新数组时,让数组中有100万个元素考虑将一个数组的元素的时间复制到另一个数组


还有一件事我想告诉您,ArrayList实现使用了相同的逻辑,只是使用了新的长度。

使用ArrayList或Arrays.copyOf()。你是否可以使用ArrayList并不重要。这很重要,因为你正在用不同的数组对象替换数组对象。天哪。这么多好的答案。很难选择最好的!我想我会把答案留给公众,或者等待一个致命的答案。Java有一个非常好的统一性!是的,我理解时间复杂性,我知道增量se by one将使其成为一个耗时的应用程序。这只是一个理论——现在人们记住了数组是一个对象,并且变量指向它,临时数组可以删除,从而将时间复杂度降低一半。此外,我还没有了解ArrayList。