Integer缓存(-128~127)大家都知道,但Byte、Short、Long、Character、Boolean、Double这几个包装类各自的缓存策略是什么?这篇真实用==对比六种类型,再反射读出缓存数组长度逐一验证。
每种包装类型分别测试127(缓存边界内)和128(缓存边界外)两个值的==行为。
BoxingCacheTypesDemo.java Byte b1 = 100, b2 = 100; Short s1 = 127, s3 = 128; Long l1 = 127L, l3 = 128L; Character c1 = 127, c3 = 128;
Byte(100)==Byte(100) 真实结果: true Short(127)==Short(127) 真实结果: true Short(128)==Short(128) 真实结果: false Long(127)==Long(127) 真实结果: true Long(128)==Long(128) 真实结果: false Character(127)==Character(127) 真实结果: true Character(128)==Character(128) 真实结果: false Integer(127)==Integer(127) 真实结果: true Integer(128)==Integer(128) 真实结果: false Boolean.TRUE 真实是否单例: true Double(1.0)==Double(1.0) 真实结果: false Float(1.0)==Float(1.0) 真实结果: false
真实结果证明:Short、Long、Character、Integer这四种类型在128这个边界上表现出真实一致的行为模式——127以内==为true(共享缓存对象),128就变成false(各自new出独立对象)。而Double和Float真实完全不参与这套机制,任何值(哪怕是同一个1.0)每次装箱都真实产生新对象,==恒为false。Boolean比较特殊,它只有true/false两个可能值,JDK真实把这两个值都做成了单例。
BoxingCacheTypesDemo.java Class<?> cls = Class.forName("java.lang.Character$CharacterCache"); Field f = cls.getDeclaredField("cache"); Object[] arr = (Object[]) f.get(null);
真实反射读取 java.lang.Byte$ByteCache 缓存数组长度 = 256 真实反射读取 java.lang.Short$ShortCache 缓存数组长度 = 256 真实反射读取 java.lang.Long$LongCache 缓存数组长度 = 256 真实反射读取 java.lang.Character$CharacterCache 缓存数组长度 = 128 真实反射读取 java.lang.Integer$IntegerCache 缓存数组长度 = 256
每一行都是真实的 == 比较结果加真实反射读出的缓存数组长度,不是查文档抄的。