为何Java程序输出数组元素为0却仍能正确返回数组最大值?
问题拆解:数组输出全0却能返回正确最大值的原因
嘿,这个问题其实是代码执行顺序和数组默认初始化的巧合导致的,咱们一步步捋清楚:
先看maximum()方法的执行流程
你写的maximum()方法里,代码顺序是关键,我把它拆成三步:
- 初始化max为数组初始值:
int max = variables[0];—— 因为variables是静态数组,Java里int类型数组默认所有元素都是0,所以这时候max的值是0。 - 给数组元素赋值随机数:循环给每个
variables[i]赋rand.nextInt(100)+1,也就是1到100之间的整数(注意这里是+1,所以不会出现0)。 - 遍历找最大值:逐个比较数组元素和当前
max,把更大的值赋给max。
为什么能正确返回最大值?
因为你给数组赋的所有值都是1到100,全都比初始的max(0)大。所以在遍历的时候,第一个数组元素就会把max从0替换成自己的值,之后再依次和后面的元素比较,最终得到数组的真实最大值。哪怕初始max是0,也完全不影响结果——毕竟所有数组元素都比它大嘛。
为什么输出数组全是0?
这大概率是你在main方法里调用maximum()之前就输出了数组。举个例子,如果你的main是这样的:
public static void main(String Args[]) { // 先输出数组:此时还没调用maximum(),数组还是默认的全0 System.out.println(Arrays.toString(variables)); int max = maximum(); System.out.println("最大值:" + max); }
那你看到的数组输出肯定是全0,但最大值是正确的。反过来,如果先调用maximum()再输出数组,就能看到随机生成的数值了。
优化建议
虽然当前代码能跑对,但逻辑顺序有点别扭,很容易让人误解。建议调整maximum()的代码顺序,先给数组赋值,再初始化max,这样逻辑更清晰,也避免依赖这种巧合:
static int maximum() { Random rand = new Random(); // 第一步:先给数组赋随机值 for (int i = 0; i < 10; i++) { variables[i] = rand.nextInt(100)+1; } // 第二步:用数组第一个元素初始化max int max = variables[0]; // 第三步:遍历找最大值(可以从i=1开始,少一次无效比较) for (int a = 1; a < variables.length; a++) { if (variables[a] > max) { max = variables[a]; } } return max; }
这样代码逻辑更直观,以后修改生成随机数的范围(比如允许生成0)也不会出问题,维护起来更省心。
内容的提问来源于stack exchange,提问作者bugjuice
相关产品推荐
相关产品推荐

