Integer i1=1;
Integer i2=1;
Integer i3=128;
Integer i4=128;
System.out.println(i1==i2);
System.out.println(i3==i4);这个题的答案?主要是原因是?
Integer i2=1;
Integer i3=128;
Integer i4=128;
System.out.println(i1==i2);
System.out.println(i3==i4);这个题的答案?主要是原因是?
i1是一个int类型,按照你的这种写法应该是在JavaSE5以后,那么这个int会被自动装箱,生成一个包装对象,并出现在堆(heap)中,同理i2也会生成一个包装对象。
理论上来说,这两个包装对象应该是不一样的。但是JVM会对这样的代码进行优化,使其指向同一个对象。
据说会将1-127的数字的包装对象做成常量,忘了是在哪里看到的了。
所以System.out.println(i1 == i2)返回 true
而System.out.println(i3 == i4) 返回 false如果JVM没有进行优化的话,就都应该返回false。P.S.没有实际运行,结果可能和我说的不一样。
true
false
java为每个原始类型(基本类型)都提供了封装类(即引用类型),引用类型和基本类型是完全不同的行为int i =1;Integer i= new Integer(1);(要把integer 当做一个类看)
false
因为:The autoboxing specification requires that boolean, byte, char <= 127, and short and
int between –128 and 127 are wrapped into fixed objects.
false
integer按正常是在jvm内存的堆里面建立一个对象来进行引用,但是jvm会对数字进行一些优化,存在缓冲中,会储存-128-127的数字,会使他们指向同一个对象。
System.out.println(Integer.valueOf(3) == Integer.valueOf(3)); 结果是 false true
查看JDK文档的valueOf()方法
public static Integer valueOf(int i)返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。
结论:Integer内部缓存了-128到127共256个Integer对象,valueOf如果在这个范围以内,返回的是同一个对象,如果不在这个范围以内,返回一个新的对象。
Study everyday with everyone!