我对ArrayList的行为完全感到困惑。写了很长的文章,然后意识到没人会去分析巨大的代码,因此只是问题的核心。数字是为了方便起见,但是在我的应用中,这些0和24是动态值。
ArrayList<VoipBlock> sortedBlocks = new ArrayList<VoipBlock>();
VoipBlock vb3 =new VoipBlock();
vb3=sortedBlocks.get(0);
vb3.setPacketNumber(24);
本质上,我的最终目标是:修改并添加回arrayList作为新值。但是,当我这样做时,ArrayList-> unsortedBlocks.get(0);中位置0的家伙;复制对vb3所做的所有更改,这当然不是我想要的。我希望vb3在ArrayList中获取与VoipBlock相同的值,但我希望将其拆离。
这是通过引用传递的另一种情况。我讨厌技术上的解释-Java通过值传递所有内容,但是在某些情况下,它通过值传递引用-这与说不油腻的油一样。请帮忙。
这让我想起了我开始学习JavaScript的经历-我讨厌该语言-直到在lynda.com上观看了正确的材料-JavaScript良好实践? -图表杀死了我。懒惰的描述使我们远离青年人,而不是技术本身。
请不要让它困扰我的压力,也不要被我冒犯,这只是一般的抱怨,也许有人会看着它并使生活变得更好:-)
谢谢你的时间,
拼命等待帮助:-)
最佳答案
要实现您的目标,可以使用克隆方法。您必须在VoipBlock类中重写此方法
可以说VoipBlock如下
public class VoipBlock {
private int packetNumber;
private String type;
public int getPacketNumber() {
return packetNumber;
}
public String getType() {
return type;
}
public void setPacketNumber(int value) {
packetNumber = value;
}
public void setType(String value) {
type = value
}
public VoipBlock clone() {
VoipBlock clone = VoipBlock();
clone.setType(this.getType());
clone.setPacketNumber(this.getPacketNumber());
return clone;
}
}
因此,使用相同的代码,您可以执行如下操作
ArrayList<VoipBlock> sortedBlocks = new ArrayList<VoipBlock>();
VoipBlock vb3 =new VoipBlock();
sortedBlocks.add(vb3);
vb3=sortedBlocks.get(0).clone();
vb3.setPacketNumber(24);
请注意,在上述代码段中调用克隆方法后,将为vb3分配一个新的VoipBlock实例。并且已经将VoipBlock插入到阵列中保持不变。
如果您希望获得某种VoipBlock实例的示例实例,以后又想在创建类似的实例时使用它们。检查代码的不变性/可变性方面。查看Joshua Blouch撰写的“有效Java”