No3*_*o3x 9 java for-loop reference
我在我的代码中发现了一个问题.首先是代码:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出是:
a
b
c
over
over
over
Run Code Online (Sandbox Code Playgroud)
我假设第一个循环也会覆盖数组中的String.所以输出在任何情况下都会结束.它似乎创建了值的副本而不是创建引用.我从未察觉过这一点.我做错了吗?是否有选项来创建引用?
//编辑:除了我之外,似乎每个人都知道这一点.我来自C背景,并没有足够重视与C非常不同的术语参考.幸运的是,我花了10分钟来计算出来(这一次).
Ada*_*zyk 18
这个:
for (String s : blablubb) {
s = "over";
}
Run Code Online (Sandbox Code Playgroud)
等于这个:
for (int i = 0; i < blablubb.length; i++) {
String s = blablubb[i];
s = "over";
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个临时String,其中包含数组值的副本,并且您只更改副本.这就是blablubb[]内容保持不变的原因.
如果要更改数组中的值,只需使用第二个选项:
for (int i = 0; i < blablubb.length; i++) {
blablubb[i] = "over";
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,你只需要一行打印一个数组:
System.out.println(Arrays.toString(blablubb));
Run Code Online (Sandbox Code Playgroud)
您的for(String s : blablubb)循环等效于以下代码:
for(int i = 0; i < blablubb.length; i++ ) {
String s = blablubb[i];
s = "over";
}
Run Code Online (Sandbox Code Playgroud)
希望从中您可以看到,您所做的只是在s不更改blablubb[i]. 这解释了您看到的输出。