日期:2014-05-20  浏览次数:20865 次

有没有动态的分配数组比较高效的方法
现在需要从一个文件中读取数据到一个数组中,数组的大小要到读完文件才能确定大小。最终结果可能数组会比较大也可能比较小,因此需要动态的分配一个数组。

如果先分配100个长度的数组,如果读取时发现数组小了,就分配一个长度为200的数组,还小就分配个长度为300。将前一个数组拷贝过来,并丢弃前一个数组。结束时,再将得到的数组多余部分裁掉。这样的方法似乎比较低效,并且可能会比较消耗内存,因此想请问各位有没有比较高效的方法解决这个问题?

------解决方案--------------------
那就用list啊
------解决方案--------------------
为什么一定要用数组?换个数据结构不行?

------解决方案--------------------
参考一下ArrayList的实现吧,或者直接用。一般采用二倍的扩充方式
------解决方案--------------------
or LinkedList
------解决方案--------------------
元素填充完毕之后调trimToSize()去除多余内存。
------解决方案--------------------
探讨

引用:

参考一下ArrayList的实现吧,或者直接用。一般采用二倍的扩充方式


我的实现方法就是参照了ArrayList实现,ArrayList本来就比较低效。采用二倍扩容的话会比较耗内存,而且这个数值应该不用二倍怎么多,所以采用每次增加100。

------解决方案--------------------
如果你喜欢研究的话那就看看。
System类的静态方法吧,
arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
------解决方案--------------------
探讨
引用:

为什么一定要用数组?换个数据结构不行?


如果使用数据结构,由于java没有指针,要使用类实现,这样将更低效。

------解决方案--------------------
数组对象不是一个类对象??数组是怎么实现的??
------解决方案--------------------
探讨
现在需要从一个文件中读取数据到一个数组中,数组的大小要到读完文件才能确定大小。最终结果可能数组会比较大也可能比较小,因此需要动态的分配一个数组。

如果先分配100个长度的数组,如果读取时发现数组小了,就分配一个长度为200的数组,还小就分配个长度为300。将前一个数组拷贝过来,并丢弃前一个数组。结束时,再将得到的数组多余部分裁掉。这样的方法似乎比较低效,并且可能会比较消耗内存,因此想请问各位……

------解决方案--------------------
File的话,可以直接通过 file.length()得到文件大小,然后一次性分配好内存空间,然后载入

13楼已经说的很清楚了
------解决方案--------------------
探讨

引用:

参考一下ArrayList的实现吧,或者直接用。一般采用二倍的扩充方式


我的实现方法就是参照了ArrayList实现,ArrayList本来就比较低效。采用二倍扩容的话会比较耗内存,而且这个数值应该不用二倍怎么多,所以采用每次增加100。

------解决方案--------------------
探讨
引用:

File的话,可以直接通过 file.length()得到文件大小,然后一次性分配好内存空间,然后载入

13楼已经说的很清楚了


问题是数组内的元素不是单字节元素。是不确定长度的多字节。

------解决方案--------------------
对于多个 IDAT 块,用LinkedList来保存即可
------解决方案--------------------
探讨
我没有说高效,只是每次加100可以更节省内存。

实际情况是读取一个png图片,而其中的IDAT块可能会有多块,但IDAT的块应该不会太大。测试了一个1920 * 5384的图片,有104块。当然这可能是个特例,再大应该也不会大到哪里去。因此采用每次加100。

有哪位知道png的IDAT块是否有最大限制?

------解决方案--------------------
在java,集合类的很多实现类当中,到处可见数据接口扩容的代码,常用的都是*2。另外使用native方法copy数组内容,基本已经达到了最佳速度了。
public static native void arraycopy();
至于内存,java本身就是个耗内存的主,呵呵。
------解决方案--------------------
探讨
现在的问题就是事先不知道数组将是多大,否则也就没有这一问题了。因此png文件格式在这方面不太合理。像bmp就有标识数据大小的标识。
Java手册里有:
add 操作以分摊的固定时间 运行,也就是说,添加 n 个元素需要 O(n) 时间。
O(n)的时间复杂度就是比较低效的。

记得看过C++里面实现ArrayList就是以翻倍的形式扩展数组。