我正在学习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];
}
我知道如果进程中断,这会导致数据丢失,但除此之外,这是一个坏主意吗?我有什么选择?
谢谢!
答案 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实现使用相同的逻辑,除了你正在使用的新长度。