2014-09-05 75 views
5

我一直在测试一些不同的方式来乘以一个常量数组的项目。Java数组循环行为

我也取决于产生不同的结果如何我遍历数组,我无法理解这一点(我是相当新的Java和仍然让我周围的事物,如何传递或引用头)。

测试1

int[] array = {1, 2, 3, 4}; 

for (int number : array) 
{ 
    number *= 2; 
} 

从而造成未修改的数组项:

{1, 2, 3, 4} 

好像number是不实际的数组元素,但被初始化它一个新的int的价值。那是对的吗?


试验2

我认为,通过使用对象可能工作的阵列,假设number然后到实际的数组项的引用。这是我在使用Integer的测试,而不是int

Integer[] array = {1, 2, 3, 4}; 

for (Integer number : array) 
{ 
    number *= 2; 
} 

再次,导致数组项不变:

{1, 2, 3, 4} 

测试3

经过一番挠头我尝试了不同的方法循环,​​例如:

int[] array = {1, 2, 3, 4}; 

for (int i = 0; i < array.length; i ++) 
{ 
    array[i] *= 2; 
} 

在数组项所得乘以:

{2, 4, 6, 8} 

这最后的结果对我来说很有意义,但我不明白,从第二次测试的结果(或第一为此事)。到现在为止,我一直认为测试1和测试2中使用的循环只是测试3中使用的循环的简写版本,但它们明显不同。

为什么没有这方面的工作如我所料?为什么这些循环不同?

+0

,你正在做的像阵列[0] = array [0] * 2;即你用新的相乘值替换数组。 – 2014-09-05 04:04:36

+0

跟我说说 - Java是通过价值传递的。 Java是通过价值传递的。 Java是通过价值传递的。 – csmckelvey 2014-09-05 04:39:16

回答

6

这是因为增强for环阵列中使用的值的副本。在

for (int number : array) { 
    number *= 2; 
} 

的代码是类似于:使用Integer[]

for(int i = 0; i < array.length; i++) { 
    int number = array[i]; 
    number *= 2; 
} 

同样的情况。

此外,当使用有增强for环在Iterable例如List,它使用迭代器代替。这意味着,像这样的代码:

List<Integer> intList = new ArrayList<>(); 
intList.add(1); 
intList.add(2); 
intList.add(3); 
intList.add(4); 
for(Integer i : intList) { 
    i *= 2; 
} 

是类似于:

for(Iterator<Integer> it = intList.iterator(); it.hasNext();) { 
    Integer i = it.next(); 
    i *= 2; 
} 

相关信息:

在第三种情况下