分配给另一个的ArrayList类型变量在Android Java中作为引用传递

时间:2016-10-12 07:55:46

标签: java android arraylist

我正在开发一个Android项目。首先,我不是Java开发人员。现在我想了解一下Java编程,特别是关于ArrayList。请参阅下面的代码

        ArrayList<Bitmap> previewBitmaps = new ArrayList<Bitmap>();
        //initialize values - total 3 elements
        previewBitmaps.remove(2);
        ArrayList<Bitmap> temp = new ArrayList<Bitmap>();
        temp = previewBitmaps;
        previewBitmaps.removeAll(previewBitmaps);
        //here temp size become zero because previewBitmaps cleared

正如您在上面的代码中看到的,我从previewBitmaps中删除了一个项目,然后我将剩余的2个项目分配给了temp。所以temp的大小将是2.然后我清除previewBitmaps。所以previewBitmaps的大小变为0.但问题是临时大小也变为0.为什么?

实际上临时尺寸应为2.对吗?我不清楚的是它是否被指定为C中的参考变量?为什么?我该如何清除该参考?

6 个答案:

答案 0 :(得分:1)

这里temp = previewBitmaps;您将previewBitmaps ArrayList的内存地址分配给temp。这意味着它们都指向相同的内存地址。您对其执行的每个操作都将适用于两者,因为它们指向内存中的同一个对象。

如果要创建ArrayList的新副本,可以使用: temp = new ArrayList(previewBitmaps);

答案 1 :(得分:1)

因为当你将一个非原始对象分配给另一个非原始对象时,实际上java会使这两个变量指向内存中的一个位置。当您更改内存中的数据时,这些变量都会受到影响。

只有原始类型不要这样做,例如对于一个int变量,这样的事情不会发生,但对于所有非原始类型,就像这样;)

原始类型是int,float,char,...

答案 2 :(得分:1)

你的问题基本上是:不要试图同时学习java编程和android。

示例:

ArrayList<Bitmap> previewBitmaps = new ArrayList<Bitmap>();

创建一个新的地图。所以:

ArrayList<Bitmap> temp = new ArrayList<Bitmap>();

但你的下一行

temp = previewBitmaps;

抛出远离您在上一步中创建的列表。不见了。创建一个新列表以便将其丢弃之后有什么意义?!

两个变量 previewBitmaps temp 都指向相同引用。所以你不是在操纵两个不同的列表,而是之后只有一个列表。

如果您的想法是创建第一个列表的“临时”副本;你可能在做什么

List<Bitmap> temp = new ArrayList<>(previewBitmps);

代替(上面创建了一个 new 列表,其中包含其他列表的所有元素)。

请注意:作为类型,您应该更喜欢使用更抽象的界面,例如 List 。您只使用具体类型(如创建对象时的 ArrayList );之后,您应该只使用List界面访问对象。

因此:首先关注这样的java基础知识!否则,您使用Android的体验将非常短暂且令人沮丧。因为你将从一个问题运行到下一个问题。在尝试运行之前学习抓取。

答案 3 :(得分:0)

您可以将previewBitmaps的值设置为temp。 您可能想使用temp.addAll(previewBitmaps);

答案 4 :(得分:0)

previewBitmaps是指向对象的引用变量。现在,当您删除位置2处的项目时,对象(列表)的大小为2。 现在,当您编写ArrayList<Bitmap> temp = new ArrayList<Bitmap>()时,它会在堆内存中创建一个新对象,并且引用变量temp指向该新对象。 然后你拨打temp = previewBitmaps。现在临时指向previewBitmaps指向的同一个对象。因此,当你打电话

previewBitmaps.removeAll(previewBitmaps); 

它会从参考变量所指向的对象中删除所有项目,即previewBitmaps和temp。

答案 5 :(得分:0)

当您为同一对象分配两个引用时,会发生这种情况。 您需要对当前ArrayList进行深度克隆,而不是浅层。

private void dgv_order_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { dgv_order.CurrentCell.Selected = false; dgv_order.ClearSelection(); }

执行for(Bitmap b: previewBitmaps){ temp.add(b.clone()) }无法获得帮助,因为它会创建一个新的temp = previewBitmaps.clone(),但两个列表都将指向内部的相同对象。这被称为浅克隆。