有没有动态的分配数组比较高效的方法
现在需要从一个文件中读取数据到一个数组中,数组的大小要到读完文件才能确定大小。最终结果可能数组会比较大也可能比较小,因此需要动态的分配一个数组。
如果先分配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就是以翻倍的形式扩展数组。