JAVA:调整数组列表的大小,创建的旧数组和临时数组会发生什么变化?
我一直在为一个数据结构分配在Java中的类工作,在这个类中,我们手动实现了一个数组列表,下面是我在类中创建的增加数组列表容量的方法:JAVA:调整数组列表的大小,创建的旧数组和临时数组会发生什么变化?,java,memory-management,arraylist,dynamic-arrays,Java,Memory Management,Arraylist,Dynamic Arrays,我一直在为一个数据结构分配在Java中的类工作,在这个类中,我们手动实现了一个数组列表,下面是我在类中创建的增加数组列表容量的方法: public void increaseCapacity () { Object[] tmp = new Object[_maxItems*2]; if (_listItems !=null) { System.arraycopy(_listItems, 0, tmp, 0, _maxItems); _maxIte
public void increaseCapacity () {
Object[] tmp = new Object[_maxItems*2];
if (_listItems !=null) {
System.arraycopy(_listItems, 0, tmp, 0, _maxItems);
_maxItems = _listItems.length;
}
_listItems = tmp;
} // Increase size of list (doubles in size each time)
使用\u listItem
作为对象数组,我将元素添加到/resize ect,我了解使用临时数组如何将其内容复制回\u listItem
以增加大小,但我不了解的是大小较小的原始\u listItem
数组会发生什么情况
当tmp
对象数组被复制到\u listItem
中时,是否为变量\u listItem
创建了新内存,并且tmp
被复制到该内存中?或者当tmp
被复制到\u列表项中时,是否使用了相同的内存并在其上“附加”了额外的空间?(我希望读得好)
当tmp
被复制到数组中时,数组\u listItem
本质上是一个新变量,如果是这样,在没有我明确这么做的情况下,它的大小是如何增加的
我觉得这与was Java管理内存有关,但我无法理解这一点。当您这样做时:
Object[] tmp = new Object[_maxItems*2];
_listItems = tmp;
您正在创建一个新的对象数组和一个引用它的变量tmp
稍后,当您执行以下操作时:
Object[] tmp = new Object[_maxItems*2];
_listItems = tmp;
发生了两件事:
\u listItems
引用的数组不再被引用。如果它没有被其他变量引用,那么它将在以后被垃圾收集
tmp
引用的数组现在也被\u listItems
引用。不执行任何复制
Java有一个垃圾收集器机制。每个变量(除了整数类型的变量,如int
,float
等)实际上都包含对对象的引用。这些对象可以是数组或其他普通对象,如字符串。每当对象未被任何变量引用时,垃圾收集器都可以释放该对象使用的内存。出于性能原因,它不一定会立即执行此操作,它可以等待一段时间,在该时间内创建另一个对象需要一些内存。执行此操作时:
Object[] tmp = new Object[_maxItems*2];
_listItems = tmp;
您正在创建一个新的对象数组和一个引用它的变量tmp
稍后,当您执行以下操作时:
Object[] tmp = new Object[_maxItems*2];
_listItems = tmp;
发生了两件事:
\u listItems
引用的数组不再被引用。如果它没有被其他变量引用,那么它将在以后被垃圾收集
tmp
引用的数组现在也被\u listItems
引用。不执行任何复制
Java有一个垃圾收集器机制。每个变量(除了整数类型的变量,如int
,float
等)实际上都包含对对象的引用。这些对象可以是数组或其他普通对象,如字符串。每当对象未被任何变量引用时,垃圾收集器都可以释放该对象使用的内存。出于性能原因,它不一定会立即执行此操作,它可以等待一段时间,在该时间内创建另一个对象需要一些内存。之前
_listItems = tmp;
\u listItems
正在引用旧的数组对象。在该行之后,它引用的是tmp
引用的对象
假设您的程序对旧对象没有其他可访问的引用,它将被垃圾收集,并且它占用的内存将被释放。以前
_listItems = tmp;
\u listItems
正在引用旧的数组对象。在该行之后,它引用的是tmp
引用的对象
假设您的程序没有对旧对象的其他可访问引用,它将被垃圾收集,并且它占用的内存将被释放。一旦引用丢失并且您无法再次访问它,垃圾收集器将释放内存,旧(较小)数组将被“销毁”
一旦引用丢失,您无法再次访问它,垃圾收集器将释放内存,旧的(较小的)数组将被“销毁”
数组在内存中是连续的。当您创建一个新的数组对象时,它必须分配一个新的连续内存块来保存新值。当您将变量_listItem分配给tmp数组时,您需要更改_listItem指向的内存地址。此时,原始值将受制于GC(假设不存在对它的其他引用),数组在内存中是连续的。当您创建一个新的数组对象时,它必须分配一个新的连续内存块来保存新值。当您将变量_listItem分配给tmp数组时,您需要更改_listItem指向的内存地址。在这一点上,原始值将受制于GC(假设不存在对它的其他引用)太棒了!!!我认为最能澄清这一点的是意识到\u listItems=tmp
实际上是在编辑对新对象数组的引用!!!我认为最清楚这一点的是意识到\u listItems=tmp
实际上是编辑对新对象数组的引用