Java for循环值或引用

我在我的代码中发现了一个问题。 首先是代码:

public class Main { /** * @param args */ public static void main(String[] args) { String[] blablubb = { "a", "b", "c" }; for(String s : blablubb) { s = "over"; } printArray(blablubb); for (int i = 0; i < blablubb.length; i++) { blablubb[i] = "over"; } printArray(blablubb); } public static void printArray(String[] arr) { for( String s : arr ) { System.out.println(s); } } } 

输出是:

 a b c over over over 

我假设第一个循环也会覆盖数组中的String。 所以输出在任何情况下都会结束。 它似乎创建了一个值的副本,而不是创建一个引用。 我从未察觉过这一点。 我做错了吗? 是否有选项来创建引用?

//编辑:除了我之外,似乎每个人都知道这一点。 我来自C背景,并没有足够重视与C非常不同的术语参考。幸运的是,我花了10分钟来计算出来(这一次)。

这个:

 for (String s : blablubb) { s = "over"; } 

等于这个:

 for (int i = 0; i < blablubb.length; i++) { String s = blablubb[i]; s = "over"; } 

这将创建一个临时String,其中包含数组值的副本,并且只更改副本。 这就是blablubb[]内容保持不变的原因。

如果要更改数组中的值,只需使用第二个选项:

 for (int i = 0; i < blablubb.length; i++) { blablubb[i] = "over"; } 

而且,顺便说一下,你可以只用一行打印一个数组:

 System.out.println(Arrays.toString(blablubb)); 

你的for(String s : blablubb)循环等价于以下代码:

 for(int i = 0; i < blablubb.length; i++ ) { String s = blablubb[i]; s = "over"; } 

希望你可以看到,你所做的就是在不改变blablubb[i] s情况下为s重新分配不同的值。 这解释了您看到的输出。

for-each循环不会修改它迭代的对象集合中包含的对象。 它传递的值不是参考值。

  s = "over"; 

只更改s的引用而不是数组中的String。

 blablubb[i] = "over"; 

更改存储在数组中第i个位置的值

 for(String s : StringArray) { } 

就好像

 for(int i = 0; i < StringArray.length; i++) { String s = StringArray[i]; } 

如果你想进行低级优化,知道如何,你必须查看Java代码和内部字节代码(编译代码)

 for(String s : blablubb) { s = "over"; } 

等于:

 for (int i = 0; i < blablubb.length; i++) { String s = blablubb[i]; s = "over"; } 

这就是输出的原因。