我尝试更改循环的最大值以延长治疗时间; 当我按如下方式更改最大值时,一切都会按我想要的方式进行:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
Integer n=10;
int i=0;
List<String> lis = new ArrayList<>();
while (i<n) {
i++;
//System.err.println(n);
lis.add("1");
//chengeMaxvalue(n, lis);
System.out.println(n);
n=20;// this line modify the limit value in loop
}
lis.stream().forEach(System.out::println);
}
private static void chengeMaxvalue(int n, List<String> lis) {
lis.add("2");
n=20; // this line don't modify the limit value in loop
}
}
但是当我尝试在嵌套函数(//注释代码)内修改它时,它不起作用。但对于列表,我可以在嵌套函数内添加元素。
int
和 List
的作用域不同吗?
最佳答案
chengeMaxvalue
的问题方法的特点是该方法的参数是按值传递的 int
值(而不是引用值)。因此,n
的值传入该方法的是 n
的副本main
中的变量方法,内存中的值不相同。
要解决这个问题,您可以使用 static
两者之外的变量 main
和changeMaxvalue
并更改 changeMaxvalue
中的值方法:
public class Test {
private static int n = 10;
public static void main(String[] args) {
int i=0;
List<String> lis = new ArrayList<>();
while (i<n) {
i++;
lis.add("1");
System.out.println(n);
changeMaxvalue(lis);
}
lis.stream().forEach(System.out::println);
}
private static void chengeMaxvalue(List<String> lis) {
lis.add("2");
n=20;
}
}
您还可以将上限封装在类中,以便方法参数通过引用传递,而不是通过值传递:
public class UpperBound {
private int n;
public UpperBound(int n) {
this.n = n;
}
public int getN() {
return n;
}
public void setN(int n) {
this.n = n;
}
}
public class Test {
public static void main(String[] args) {
UpperBound upperBound = new UpperBound(10);
int i=0;
List<String> lis = new ArrayList<>();
while (i < upperBound.getN()) {
i++;
lis.add("1");
System.out.println(n);
changeMaxvalue(upperBound, lis);
}
lis.stream().forEach(System.out::println);
}
private static void chengeMaxvalue(UpperBound upperBound, List<String> lis) {
lis.add("2");
upperBound.setN(20);
}
}
有关按值传递与按引用传递的详细信息,请参阅 Passing by Value vs. Passing by Reference in Java .
关于java - 修改java中循环的最大值(for和while,..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59969859/