`
my_java_life
  • 浏览: 143916 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

关于java中的类型比较面试题,求解?

阅读更多

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)行这种的结果比较迷惑?

 

 

 

 

 

 

3
1
分享到:
评论
9 楼 ps329795485 2012-03-03  
以前面试也有遇到这问题
8 楼 canghailan 2012-03-02  
你把Auto Boxing去掉就看清楚了:
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就有参数可以调整这个缓存的大小。
7 楼 zhchx0827 2012-03-02  
就两点:自动拆箱,缓存。看下源码就清楚了
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) 
这两行代码都隐式做了折箱操作


"缓存范围[-128到127],超出此范围的不会被缓存"===>这句话请仔细讲一下。
5 楼 wind_1121 2012-03-02  
jdk1.5支持自动装箱和拆箱,Integer类型自动转为int类型,Integer类型比较的是内存地址,可定不同
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) 
这两行代码都隐式做了折箱操作
3 楼 cuisuqiang 2012-03-02  
对象比较和值比较能一样吗
一个是应用比较,一个是值比较,==是比较其引用,如果不是对象那就是比较的值
神马呀
2 楼 my_java_life 2012-03-02  
自动封装,不是把原始类型封装成对象类型---向上转型。
1 楼 fuchao01 2012-03-02  
2,3两种应该是java5的新特性自动封装,他将对象转化为int型,所以相等!

相关推荐

Global site tag (gtag.js) - Google Analytics