在Java中重新定义数组的技术:是否“使数组无效”?

时间:2015-06-03 11:20:14

标签: java arrays dynamic

我正在学习Java,令人惊讶的是我发现Java数组不是动态的 - 即使它的cousing语言有动态数组。

所以我想出了一些想法来自己模仿java中的动态数组。

我想到的是将原始数组引用复制到临时数组,然后将原始数组转换为null,将其索引重新设置为更大的值,然后最终从临时数组中重新复制值。 / p>

示例:

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];
        }

我知道如果进程中断,这会导致数据丢失,但除此之外,这是一个坏主意吗?我有什么选择?

谢谢!

5 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

ArrayList非常方便,但一旦完整,添加元素需要线性时间。您可以使用ensureCapacity()方法实现与调整大小类似的操作。我建议您更熟悉Java的集合框架,以便将来自己做出最佳决策。

答案 2 :(得分:0)

数组不是动态的,它们的大小不能动态改变,现在你没有改变同一个对象,你用较大尺寸的对象替换较小尺寸的对象

     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。

但请继续尝试!!!

答案 3 :(得分:0)

请查看动态的java.util.ArrayList,它是Collections框架的一部分。动态制作数组应该更慢且容易出错。

答案 4 :(得分:0)

您是否听说过时间复杂度,您知道自己要增加多少时间复杂度吗?每次将旧数组元素复制到新数组时,让数组中有100万个元素然后考虑复制一个数组元素的时间到另一个阵列。

我想告诉你的另一件事,ArrayList实现使用相同的逻辑,除了你正在使用的新长度。