我有一个关于Java的基本问题ArrayList.
当ArrayList被声明和初始化使用默认构造,对于10个元件的存储器空间被创建.现在,当我添加第11个元素时,会发生什么?是否会创建具有20(或更多)元素容量的新内存空间(这需要将元素从第一个内存位置复制到新位置)还是其他一些东西?
我查了这里.但我没有找到答案.
请分享知识.谢谢.
我在Matlab中有一个大型(多GB)数组,我想截断¹.天真地,我认为截断不需要太多内存,但后来我意识到它可能会:
>> Z = zeros(628000000, 1, 'single');
>> Z(364000000:end) = [];
Out of memory. Type HELP MEMORY for your options.
Run Code Online (Sandbox Code Playgroud)
除非Matlab在截断之前做了一些聪明的优化,否则Z这段代码实际上会创建一个数组(类型为double!)364000000:628000000.我不需要这个数组,所以我可以这样做:
>> Z = Z(1:363999999);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,第二个例子有效,并且对我来说没问题.但为什么它有效呢?如果Z(364000000:end) = 0由于没有所需的中间阵列的存储器364000000:628000000,那么,为什么不Z = Z(1:363999999)因未能所需中间阵列的存储器1:363999999,这是较大的?当然,我不需要这个中间数组,并且对于在没有任何中间数组的情况下截断我的数组的解决方案感到满意,或者,如果Matlab优化了特定方法,则会失败.
¹原因:我正在处理数据,但不知道预分配多少.我做了一个有根据的猜测,经常我分配太多.我根据可用内存选择块大小,因为拆分更少的块意味着更快的代码.所以我想避免任何不必要的内存使用.另见关于按块分配的这篇文章.
在编写以下Matlab代码时:
for ii=1:n
x(ii) = foo( ii ); % foo is some function of ii that cannot be vectorized.
end
Run Code Online (Sandbox Code Playgroud)
我得到以下m-lint警告:
变量
x似乎在每次循环迭代时改变大小
我的问题:
这个问题是不能重复的这一个,因为它与预分配的更一般的问题,而是它的一个特定实例涉及.