我正在开发一个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中的参考变量?为什么?我该如何清除该参考?
答案 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()
,但两个列表都将指向内部的相同对象。这被称为浅克隆。