码迷,mamicode.com
首页 > 其他好文 > 详细

Integer比较

时间:2014-06-26 13:33:34      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:integercache   equals   自动装箱   

/**
 * @time 2014-06-25
 * @author Cao HaiCheng
 *
 */
public class demo {
	public static void main(String[] args) {
		test1();
		test2();
		test3();
		test4();
		test5();
	}
	/**
	 * 第一个答案是false很好理解,因为'=='操作符比较的是两个对象的地址,a和b指向的地址不同
	 */
	private static void test1() {
	    Integer a = new Integer(50);  
	    Integer b = 50;  
	    System.out.println("test1运行结果:"+(a == b));   //false
	}

	/**
	 * 这个答案是true,Integer a=50属于自动装箱,调用的是编译器中的public static Integer valueOf(int i)方法
	 * 我们看下这个方法:
	 *     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);
   		   }

	 * 
	 * 我们可以看到jdk源码中定义的这个方法意思是这样的:当i的值在某个范围之间的时候不用创建对象,直接去IntegerCache中取,再看下这个
	 * IntegerCache类:
	 *     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) -1);
		            }
		            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() {}
		      }
	 * 我们看到这个Cache里面放了256个值,就是-128到127之间的值
	 * 所以当Integer a = 50;  的时候并没有创建新的对象,还是引用的缓存池中的地址,所以这个结果为true
	 */
	private static void test2() {
		   Integer a = 50;  
		   Integer b = 50;  
		   System.out.println("test2运行结果:"+(a == b)); //true 
	}

	/**
	 * 这个根据上面那个说法就简单了,因为150并不在-128到127之间,所以这个需要自己创建对象,创建的对象a和b的指向地址不同
	 * 所以该结果为false;
	 */
	private static void test3() {
	    	Integer a = 150;  
	    	Integer b = 150;  
	    	System.out.println("test3运行结果:"+(a == b));//false  
	}

	/**
	 * 这个 Integer a = Integer.valueOf(50); 和Integer b = 50;  调用的方法都是编译器中的public static Integer valueOf(int i)方法
	 * 所以两个50都没有创建新的对象,都是从缓存池中拿到的对象,所以结果为true
	 */
	private static void test4() {
	    Integer a = Integer.valueOf(50);  
	    Integer b = 50;  
	    System.out.println("test4运行结果:"+(a == b));   //true
	}

	/**
	 * 同理,数值超出了范围,所以指向不同,结果为false
	 */
	private static void test5() {
	    Integer a = Integer.valueOf(150);  
	    Integer b = 150;  
	    System.out.println("test5运行结果:"+(a == b));  //false
	}
	
}

Integer比较,布布扣,bubuko.com

Integer比较

标签:integercache   equals   自动装箱   

原文地址:http://blog.csdn.net/caohaicheng/article/details/34429245

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!