关于java中的部类比较面试题,求解
关于java中的类型比较面试题,求解?
"缓存范围[-128到127],超出此范围的不会被缓存"===>这句话请仔细讲一下。
1.
public class Test { /** * @param args */ public static void main(String[] args) { Integer i1 = 128; Integer i2 = 128; int i3 = 128; int i4 = 128; System.err.println(i1 == i2);//(1) System.err.println(i1 == i3);//(2) System.err.println(i2 == i3);//(3) System.err.println(i3 == i4);//(4) } }
结果:
false true true true
2.那位对java比较基础比较扎实的大侠出来说说?对于第(2)、(3)行这种的结果比较迷惑?
1 楼
fuchao01
2012-03-02
2,3两种应该是java5的新特性自动封装,他将对象转化为int型,所以相等!
2 楼
my_java_life
2012-03-02
自动封装,不是把原始类型封装成对象类型---向上转型。
3 楼
cuisuqiang
2012-03-02
对象比较和值比较能一样吗
一个是应用比较,一个是值比较,==是比较其引用,如果不是对象那就是比较的值
神马呀
一个是应用比较,一个是值比较,==是比较其引用,如果不是对象那就是比较的值
神马呀
4 楼
edisonlv2010
2012-03-02
这里其实就两个考察点
1.常量池的知识
和String的对象池一样,几种整数基础类型的包装类型也有对象池机制。也就是说用Integer int1 = 30这种方式声明一个Integer对象时会先到对象池中找有没有值为30的对象,如果有直接拿来用,如果没有则重新创建一个对象放入对象池中。
缓存范围[-128到127],超出此范围的不会被缓存。而128刚好超出,所以i1 == i2的结果为false,如果在缓存范围内,那i1 == i2的结果就为true
2.自动装箱自动折箱的知识
System.err.println(i1 == i3);//(2)
System.err.println(i2 == i3);//(3)
这两行代码都隐式做了折箱操作
1.常量池的知识
和String的对象池一样,几种整数基础类型的包装类型也有对象池机制。也就是说用Integer int1 = 30这种方式声明一个Integer对象时会先到对象池中找有没有值为30的对象,如果有直接拿来用,如果没有则重新创建一个对象放入对象池中。
缓存范围[-128到127],超出此范围的不会被缓存。而128刚好超出,所以i1 == i2的结果为false,如果在缓存范围内,那i1 == i2的结果就为true
2.自动装箱自动折箱的知识
System.err.println(i1 == i3);//(2)
System.err.println(i2 == i3);//(3)
这两行代码都隐式做了折箱操作
5 楼
wind_1121
2012-03-02
jdk1.5支持自动装箱和拆箱,Integer类型自动转为int类型,Integer类型比较的是内存地址,可定不同
6 楼
837062099
2012-03-02
edisonlv2010 写道
这里其实就两个考察点
1.常量池的知识
和String的对象池一样,几种整数基础类型的包装类型也有对象池机制。也就是说用Integer int1 = 30这种方式声明一个Integer对象时会先到对象池中找有没有值为30的对象,如果有直接拿来用,如果没有则重新创建一个对象放入对象池中。
缓存范围[-128到127],超出此范围的不会被缓存。而128刚好超出,所以i1 == i2的结果为false,如果在缓存范围内,那i1 == i2的结果就为true
2.自动装箱自动折箱的知识
System.err.println(i1 == i3);//(2)
System.err.println(i2 == i3);//(3)
这两行代码都隐式做了折箱操作
1.常量池的知识
和String的对象池一样,几种整数基础类型的包装类型也有对象池机制。也就是说用Integer int1 = 30这种方式声明一个Integer对象时会先到对象池中找有没有值为30的对象,如果有直接拿来用,如果没有则重新创建一个对象放入对象池中。
缓存范围[-128到127],超出此范围的不会被缓存。而128刚好超出,所以i1 == i2的结果为false,如果在缓存范围内,那i1 == i2的结果就为true
2.自动装箱自动折箱的知识
System.err.println(i1 == i3);//(2)
System.err.println(i2 == i3);//(3)
这两行代码都隐式做了折箱操作
"缓存范围[-128到127],超出此范围的不会被缓存"===>这句话请仔细讲一下。
7 楼
zhchx0827
2012-03-02
就两点:自动拆箱,缓存。看下源码就清楚了
8 楼
canghailan
2012-03-02
你把Auto Boxing去掉就看清楚了:
至于缓存(JDK的实现):
至于情况(1),可能为true,也可能为false,java要求-128到127必须缓存,所以在这个范围内的情况(1)一定为true,超出这个范围的看具体实现和参数,jdk7就有参数可以调整这个缓存的大小。
public class Test { public static void main(String[] args) { Integer i1 = Integer.valueOf(128); Integer i2 = Integer.valueOf(128); int i3 = 128; int i4 = 128; System.err.println(i1 == i2);//(1) System.err.println(i1.intValue() == i3);//(2) System.err.println(i2.intValue() == i3);//(3) System.err.println(i3 == i4);//(4) } }
至于缓存(JDK的实现):
public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } ... private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low)); } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); } private IntegerCache() {} }
至于情况(1),可能为true,也可能为false,java要求-128到127必须缓存,所以在这个范围内的情况(1)一定为true,超出这个范围的看具体实现和参数,jdk7就有参数可以调整这个缓存的大小。
9 楼
ps329795485
2012-03-03
以前面试也有遇到这问题