连续if语句是否等价于逻辑与?两段Java代码输出为何不同?
为什么连续嵌套if和逻辑与&&的代码执行结果不同?
你提到的两段代码结果不同,根本原因不是嵌套if和&&的等价性问题,而是两段代码的逻辑分支覆盖范围不一样。
先看两段代码的核心差异:
第一段代码(逻辑与&&)的逻辑
在循环中,对每个元素i:
- 如果
map包含i并且当前计数+1 > 数组长度/2,直接返回i - 否则(两种情况:要么map不包含i,要么map包含i但计数+1不满足条件),都会执行
elements.put(...)更新计数
public int majorityElement(int[] nums) { if (nums.length == 1) return nums[0]; HashMap<Integer, Integer> elements = new HashMap<>(); for(int i : nums) { if(elements.containsKey(i) && (elements.get(i) +1 > nums.length / 2)) { return i; } else { elements.put(i, elements.getOrDefault(i,0) + 1); } } return -999; }
第二段代码(嵌套if)的逻辑
在循环中,对每个元素i:
- 如果
map包含i,再判断计数+1是否达标:达标就返回;不达标则什么都不做 - 只有当
map不包含i时,才执行put更新计数
public int majorityElement(int[] nums) { if (nums.length == 1) return nums[0]; HashMap<Integer, Integer> elements = new HashMap<>(); for (int i : nums) { if(elements.containsKey(i)){ if(elements.get(i) +1 > nums.length / 2){ return i; } } else { elements.put(i, elements.getOrDefault(i,0) + 1); } } return -999; }
用输入nums=[2,2,1,1,1,2,2]走一遍流程
数组长度7,nums.length/2=3,需要计数+1>3(即最终计数≥4)才满足多数元素条件。
第一段代码执行步骤:
- 第一个2:map无2 → put后
2:1 - 第二个2:map有2,1+1=2≤3 → 进入else,put后
2:2 - 第一个1:map无1 → put后
1:1 - 第二个1:map有1,1+1=2≤3 → 进入else,put后
1:2 - 第三个1:map有1,2+1=3≤3 → 进入else,put后
1:3 - 第六个2:map有2,2+1=3≤3 → 进入else,put后
2:3 - 第七个2:map有2,3+1=4>3 → 返回2,正确。
第二段代码执行步骤:
- 第一个2:map无2 → put后
2:1 - 第二个2:map有2,1+1=2≤3 → 不执行任何操作,map仍为
2:1 - 第一个1:map无1 → put后
1:1 - 第二个1:map有1,1+1=2≤3 → 不执行任何操作,map仍为
1:1 - 第三个1:map有1,1+1=2≤3 → 不执行任何操作,map仍为
1:1 - 第六个2:map有2,1+1=2≤3 → 不执行任何操作,map仍为
2:1 - 第七个2:map有2,1+1=2≤3 → 不执行任何操作
- 循环结束,返回-999,不符合预期。
总结
嵌套if的代码中,遗漏了「map包含元素但计数未达标时的计数更新」逻辑,而第一段代码的else分支覆盖了所有不满足返回条件的情况,包括这种场景。这才是两段代码结果不同的原因,和&&与嵌套if的等价性无关——如果要让嵌套if和第一段代码等价,需要在第一个if的内部(即map包含元素但不达标时)也执行计数更新,比如:
for (int i : nums) { if(elements.containsKey(i)){ if(elements.get(i) +1 > nums.length / 2){ return i; } // 新增:即使不达标,也要更新计数 elements.put(i, elements.get(i) + 1); } else { elements.put(i, 1); // 这里用getOrDefault也可以,不过第一次存直接设1更简单 } }
内容的提问来源于stack exchange,提问作者Dion
相关产品推荐
相关产品推荐

