Java面试高频题Integer缓存机制与 equals、 区别在 Java 面试中包装类是必考知识点而 Integer 缓存机制更是高频中的高频。例如下面这段代码Integera127;Integerb127;System.out.println(ab);输出true但是Integera128;Integerb128;System.out.println(ab);输出false为什么会出现这种现象本文将从包装类、自动装箱、Integer缓存池以及 equals 和 的区别几个方面深入分析。目录为什么需要包装类八大包装类自动装箱与自动拆箱 与 equals 的区别Integer缓存机制为什么127返回true为什么128返回falseInteger源码分析常见面试题开发最佳实践总结一、为什么需要包装类Java中的基本数据类型byteshortintlongfloatdoublecharboolean这些类型虽然效率高但存在局限性。例如ListintlistnewArrayList();编译直接报错。因为泛型只能使用对象。因此Java为每种基本类型提供了对应的包装类。二、八大包装类基本类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean示例Integerage18;Doublesalary10000.5;三、自动装箱与自动拆箱JDK5之后引入了自动装箱机制。自动装箱代码Integernum100;实际上IntegernumInteger.valueOf(100);编译器自动完成转换。自动拆箱代码Integernum100;intvaluenum;实际上intvaluenum.intValue();示例Integera10;Integerb20;System.out.println(ab);执行过程自动拆箱 ↓ int运算 ↓ 自动装箱如果需要四、 与 equals 的区别这是面试中的经典问题。 比较什么对于基本类型inta10;intb10;ab比较的是值结果true对于引用类型Strings1newString(abc);Strings2newString(abc);s1s2比较的是对象地址结果false因为是两个不同对象。equals比较什么Object源码publicbooleanequals(Objectobj){return(thisobj);}默认也是比较地址。但是很多类重写了equals。例如StringIntegerLongBigDecimalDate等。示例Strings1newString(abc);Strings2newString(abc);s1.equals(s2)结果true因为String重写了equals。比较的是内容。五、Integer缓存机制Integer为了提高性能避免频繁创建对象引入了缓存池。缓存范围-128 ~ 127这也是面试最常考的知识点。例如Integera100;Integerb100;实际上Integer.valueOf(100)会从缓存池获取对象。因此ab结果true六、为什么127返回true示例Integera127;Integerb127;比较System.out.println(ab);输出true执行过程Integer.valueOf(127)发现127 属于缓存范围直接返回缓存对象。图示IntegerCache ↓ 127对象 ↑ ↑ a b因此a和b指向同一个对象结果ab为true七、为什么128返回false代码Integera128;Integerb128;比较System.out.println(ab);输出false原因128 超出缓存范围执行Integer.valueOf(128)时创建新对象图示a ↓ Integer(128) ────────── b ↓ Integer(128)两个对象地址不同。因此ab结果false八、源码分析查看 Integer 源码publicstaticIntegervalueOf(inti){if(iIntegerCache.lowiIntegerCache.high){returnIntegerCache.cache[i(-IntegerCache.low)];}returnnewInteger(i);}核心逻辑如果在缓存范围 直接返回缓存对象 否则创建新对象继续查看缓存范围staticfinalintlow-128;staticfinalinthigh127;因此-128 ~ 127被缓存。九、new Integer为什么不同示例IntegeranewInteger(127);IntegerbnewInteger(127);比较System.out.println(ab);结果false原因new强制创建新对象。不会走缓存池。图示a → 对象A b → 对象B地址不同。十、Integer与int比较示例Integera128;intb128;System.out.println(ab);结果true原因发生自动拆箱。实际执行a.intValue()b变成128128比较的是值。因此true十一、常见面试陷阱示例1Integera127;Integerb127;System.out.println(ab);结果true示例2Integera128;Integerb128;System.out.println(ab);结果false示例3Integera128;Integerb128;System.out.println(a.equals(b));结果true示例4IntegeranewInteger(100);IntegerbnewInteger(100);System.out.println(ab);结果false示例5Integera100;intb100;System.out.println(ab);结果true十二、常见面试题面试题1Integer缓存范围是多少答案-128 ~ 127面试题2为什么127127返回true答案使用缓存对象 地址相同面试题3为什么128128返回false答案超出缓存范围 创建两个新对象面试题4equals和区别答案 基本类型比较值 引用类型比较地址 equals 默认比较地址 很多类重写后比较内容面试题5Java存在引用传递吗答案没有 Java只有值传递十三、开发最佳实践1、对象比较优先使用equals推荐Integera128;Integerb128;a.equals(b);不推荐ab因为容易受到缓存机制影响。2、字符串比较使用equals推荐str1.equals(str2);不推荐str1str2;3、注意自动拆箱空指针例如Integernumnull;intvaluenum;运行NullPointerException原因num.intValue();空指针异常。总结本文介绍了包装类的作用自动装箱与拆箱 与 equals 区别Integer缓存机制为什么127返回true为什么128返回falseInteger源码分析面试高频陷阱题需要牢记Integer缓存范围 -128 ~ 127以及对象比较优先使用equals避免因为缓存机制导致逻辑错误。