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

我一直在为一个数据结构分配在Java中的类工作,在这个类中,我们手动实现了一个数组列表,下面是我在类中创建的增加数组列表容量的方法:

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
    实际上是编辑对新对象数组的引用