java - 如何在 Java 中使用泛型复制数组

标签 java arrays arraylist

我正在尝试创建我自己的 ArrayList 版本。我以这样的方式实现它:当您运行我的 add 方法时,它将创建一个新的通用对象数组。然后它将把每个元素复制到新的更大的数组中,最后一个元素将是他们添加的新项目。

public void add(E data)
{
   if(this.arr == null)
   {
       this.arr = (E[]) new Object[size];
   }
   else
   {
       this.size++;
       Object[] temp = (E[]) new Object[arr.length+1];
       for(int i = 0; i < arr.length; i++)
           temp[i] = arr[i];
       temp[arr.length] = data;
       this.arr = temp;
   }
}

我的代码可能不正确,因为我在没有测试的情况下做得非常快,并不是所有这些都会影响我的问题。

我知道在Java中每个对象(在我的例子中我正在测试Integer对象)引用内存中的一个位置。我不确定的是在复制这部分代码中的对象时数组如何工作:

for(int i = 0; i < arr.length; i++)
    temp[i] = arr[i];

每个 temp[i] 点仅引用 arr[i] 引用的内容,不会在内存中创建新点。这个说法正确吗?

如果我添加 100 个项目,这意味着该方法将运行 100 次。如果当前数组中的每个元素都被复制到大一的新对象数组中,这是否意味着垃圾收集器不会删除以前的数组,因为新元素仍然指向相同的内存点?

如果我创建一个大小为 1 的数组,它会创建一个保存该数组的内存块。如果我随后创建另一个大小为 2 的数组,第一个元素将被复制到其中并指向它,然后我重新分配变量以指向该新数组 (this.arr = temp)/

Arr 1: [0]
Arr 2: [0][1] <- [0] points to the same object as [0] from arr 1
Arr 3: [0][1][2] <- [0] points to the same object as [0] from arr 1, [1] points to the same object as [1] from arr 1

当 Arr 2 也指向其一个或多个元素时,垃圾收集器是否不会删除 Arr 1 使用的空间?对于 Arr 3 来说也是如此吗?我是否需要在每次增长时将每个元素重新分配到新数组中?

最佳答案

Each temp[i] spot is just referencing what arr[i] references and does not create a new spot in memory. Is this statement correct?

正确;您正在处理对象引用,而不是创建新对象。当你使用 temp[i] 时,你正在处理一个对象引用(c/c++ 中的指针);您不是在复制对象,而是复制对象引用。只是为了澄清一点

temp[i] = arr[i];

复制对象引用;引用的对象相同

temp[i] = new E(arr[i]);

使用另一个对象在 temp[i] 上分配一个新对象(对于示例,我假设 E 有一个复制构造函数,即采用同一类的对象作为参数的构造函数);在这种情况下,您最终会得到两个不同的对象。

Will the garbage collector not delete the space used by Arr 1, when one or more of its elements are pointed too by Arr 2? And the same for Arr 3?

是的,它会被垃圾收集;您必须将数组与其元素区分开来。如果一个数组不再被引用,它将被垃圾收集;在您的情况下,由于您的程序无法访问该数组,因此可以释放其内存。数组引用的对象遵循相同的规则;如果您的程序无法访问它们,则它们将被垃圾收集,否则不会。在您的代码中,数组元素不会被垃圾回收,因为它们被您的类的 arr 数组引用。因此,伪代码中的 Arr 1 和 Arr 2 不久之后就符合垃圾回收的条件

 this.arr = temp;

因为您的程序无法访问 arr 的“旧/上一个”引用。

关于java - 如何在 Java 中使用泛型复制数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31313102/

相关文章:

java - Android中读取json数组的方法

java - 我正在从文本文件中读取数组,然后我应该大写字母,计算每个名称的出现次数,然后显示所有信息。

java - 如何识别什么类型的自定义数组列表包含一个对象?

java - 根据用户输入将多个作者添加到 ArrayList

c++ - 这两个类型测试对象动态数组声明之间的区别?

javascript - 在 Javascript 中使用哈希表 : is an array of arrays adequate?

java - 如何将多个 commons.math SummaryStatistics 对象添加在一起?

Java:如何使用 JButton 打开 JOptionPane

java - 集成 Azure AD 以进行用户身份验证并使用 REST API 将数据存储在用户的单驱动器上

java - 将 Arrays.copyOfRange 从 Java 6 移植到 Java 5