如何在不同数据类型中使用if条件?ArrayList与int比较问题求解
解决ArrayList元素与int变量比较失效的问题
嘿,我来帮你搞定这个问题!你踩的是Java里基本类型和包装类比较的典型陷阱,咱们一步步拆解解决:
问题根源
你声明的List reg = new ArrayList();是无泛型的原始集合,所以reg.get(i)返回的是Integer包装类对象,而newReg是int基本类型。虽然Java有自动拆箱机制,但用==比较时,对于超出Integer缓存范围(-128到127)的数值,==会判断两个对象的引用地址是否相同,而不是实际的数值大小,这就导致你的判断逻辑失效。
两种可行的解决方案
方案1:使用泛型声明ArrayList(推荐)
给ArrayList指定<Integer>泛型,明确集合存储的是Integer类型,这样get()方法会直接返回Integer对象,你可以用equals()方法安全比较数值(也可以依赖自动拆箱用==,但equals()更稳妥,能避开缓存范围的坑):
import java.util.ArrayList; import java.util.List; import java.util.Random; public class Main { public static void main(String[] args) { // 指定泛型<Integer>,明确存储Integer类型 List<Integer> reg = new ArrayList<>(); reg.add(2); reg.add(5); reg.add(6); Random rand = new Random(); int newReg = rand.nextInt(4)+1; for(int i = 0; i < reg.size(); i++){ // 用equals比较数值,逻辑更可靠 if(reg.get(i).equals(newReg)){ System.out.println("找到匹配的元素:" + reg.get(i)); // 可根据需求添加break或其他逻辑 } } } }
方案2:强制转换为int基本类型
如果不想修改集合的泛型声明,你可以把reg.get(i)强制转换为int,这样就变成了基本类型之间的直接比较,==会准确判断数值大小:
import java.util.ArrayList; import java.util.List; import java.util.Random; public class Main { public static void main(String[] args) { List reg = new ArrayList(); reg.add(2); reg.add(5); reg.add(6); Random rand = new Random(); int newReg = rand.nextInt(4)+1; for(int i = 0; i < reg.size(); i++){ // 强制转换为int后,用==比较数值 if((int) reg.get(i) == newReg){ System.out.println("找到匹配的元素:" + reg.get(i)); } } } }
补充说明
为什么有时候小数值用==能碰巧生效?因为Java对-128到127之间的Integer对象做了缓存,自动装箱这个范围的数值时会复用同一个对象,所以==会判断为相等;但超出这个范围的数值,每次装箱都会创建新的Integer对象,==就会失效。所以用equals()或者强制转换为基本类型才是可靠的通用做法。
内容的提问来源于stack exchange,提问作者Syakhisk Al-azmi
相关产品推荐
相关产品推荐

