Integer integer=new Integer(5); Integer integer1=new Integer(5); //false System.out.println(integer==integer1); 我们进入Integer的源码,然后翻译 /** * 构造一个新分配的表示指定int值的Integer对象。 */ public Integer(int value) { this.value = value; } Integer integer3=Integer.valueOf(5); Integer integer4=Integer.valueOf(5); //true System.out.println(integer3==integer4);
我们在进入valueOf的源码
/** * 返回一个 {@code Integer} 实例,表示指定的 * {@code int} 值。如果不需要新的 {@code Integer} 实例, * 则此方法通常应优先于 * 构造函数 {@link #Integer(int)} 使用, * 因为此方法可能 * 产生显着更好的空间和时间性能by * 缓存频繁请求的值。 * 此方法将始终缓存 -128 到 127(包括在内)范围内的值,并且可能缓存此范围之外的其他值。 */ public static Integer valueOf(int i) { if (i >= Integer.IntegerCache.low && i <= Integer.IntegerCache.high) return Integer.IntegerCache.cache[i + (-Integer.IntegerCache.low)]; return new Integer(i); }
最终我们得出:
new Integer:返回的是一个新的对象
Integer.valueOf:在-128到127之间返回的是同一个对象