Java数组相等与数组内容相等

Java数组相等与数组内容相等,java,arrays,double,pass-by-reference,pass-by-value,Java,Arrays,Double,Pass By Reference,Pass By Value,我不确定我是否只是没有看到一个明确的答案,即我是否一直错误地理解了这种编程语言的一个重要部分 简而言之,我有一段代码,其中包含一个称为“bucket”的双精度数组。我的代码需要逐个索引解析这个数组索引,检查其值,并将最后5个值存储在一个名为“finalVals”的新数组中。Bucket数组将包含大约100个值,其中大多数是零,不需要。5个连续零的序列将意味着我需要的数据的结束。所以我需要返回bucket中的最后5个值,其中的值都是非零的。这存储在名为“非零”的数组中 lastVal=new do

我不确定我是否只是没有看到一个明确的答案,即我是否一直错误地理解了这种编程语言的一个重要部分

简而言之,我有一段代码,其中包含一个称为“bucket”的双精度数组。我的代码需要逐个索引解析这个数组索引,检查其值,并将最后5个值存储在一个名为“finalVals”的新数组中。Bucket数组将包含大约100个值,其中大多数是零,不需要。5个连续零的序列将意味着我需要的数据的结束。所以我需要返回bucket中的最后5个值,其中的值都是非零的。这存储在名为“非零”的数组中

lastVal=new double[5];//已声明但未设置全局变量
双精度非零[]=新的双精度[5];//局部变量
int numberOfZeros=0;
对于(int i=0;i
问题出在最后一盘。if条件确实可以正确地检测val是否为0(或实际上为0.0)。并在lastVal中保留最后5个值。但是,当执行该非工作行时,代码的行为就好像非零变成了指向lastVal的指针一样。从那时起,非零数组始终存储与lastVal相同的值,即使在val中遇到零也是如此。据我所知,这些变量是独立的。所以我希望在遇到非零值的情况下,非零值只能保存与lastVal相同的值。函数总是在遇到5个连续的零之前返回桶的最后5个值

解决方案是用代码替换有问题的行,这些代码单独设置非零的内容,就像我对lastVal所做的那样。那么,我在这里的代码中是否遗漏了一些明显的东西,总是将非零设置为lastVal?或者我误解了什么是非零=lastVal;真的吗?

当你这么做的时候

nonZeros = lastVal;
您将lastVal的引用指定给了非零(是的,非零变成了指向lastVal的指针)。那不是副本。你可以像

当你这么做的时候

nonZeros = lastVal;
您将lastVal的引用指定给了非零(是的,非零变成了指向lastVal的指针)。那不是副本。你可以像


lastVal在哪里定义?这是finalVals吗?除非使用new创建对象的新实例,否则使用equals实际上是“指向”同一对象。在本例中,对象是数组。i、 e.双[]aVal=新双[4];double[]aVal2=aVal“指向”完全相同的对象实例。更改该值将影响aVal和aVal2,因为它们实际上引用的是同一个对象。@lordoku很抱歉,我无意中在第一行代码中将其定义为finalVals。我已更改代码以更正此问题,谢谢。lastVal在哪里定义?这是finalVals吗?除非使用new创建对象的新实例,否则使用equals实际上是“指向”同一对象。在本例中,对象是数组。i、 e.双[]aVal=新双[4];double[]aVal2=aVal“指向”完全相同的对象实例。更改该值将影响aVal和aVal2,因为它们实际上引用的是同一个对象。@lordoku很抱歉,我无意中在第一行代码中将其定义为finalVals。我已经修改了代码来纠正这个问题,谢谢。另外,您可以执行nonZeros=lastVal.clone(),我认为Java总是使用传递值。这是否只适用于数组本身,而不适用于数组中的内容?如果这些数组是java.util.arrays类的实际实例,那么非零=lastVal是否有效?@rshaw java总是按值传递。但是对象类型(包括数组)的值是一个引用。将
nonZeros
的引用更改为
lastVal
的引用是可行的。此外,还可以执行nonZeros=lastVal.clone(),我认为Java总是使用传递值。这是否只适用于数组本身,而不适用于数组中的内容?如果这些数组是java.util.arrays类的实际实例,那么非零=lastVal是否有效?@rshaw java总是按值传递。但是对象类型(包括数组)的值是一个引用。将
非零
的引用更改为
lastVal
的引用是可行的。
System.arraycopy(lastVal, 0, nonZeros, 0, nonZeros.length);