Integer比较

Integer比较

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

/**
 * @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
	}
	
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117485.html原文链接:https://javaforall.net

(0)
上一篇 2022年1月5日 上午6:00
下一篇 2022年1月5日 上午7:00


相关推荐

  • vagrant共享目录出现“mount:unknown filesystem type ‘vboxsf‘”错误解决方法(亲测可行)

    vagrant共享目录出现“mount:unknown filesystem type ‘vboxsf‘”错误解决方法(亲测可行)

    2022年2月19日
    57
  • Tomcat下的appBase和docBase[通俗易懂]

    我们先看appBase,这个目录表示:1这个目录下面的子目录将自动被部署为应用。2这个目录下面的.war文件将被自动解压缩并部署为应用而docBase只是指向了你某个应用的目录,这个可以和appBase没有任何关系。总结:如果你想自己指定路径,那么应该在docBase里面如果你想简单,那么直接把他们复制到appBase下面就行了如果你把他们弄重复了,也就是2个指向了

    2022年4月7日
    553
  • ForkJoin调用接口

    ForkJoin调用接口ForkJoinPool newForkJoinP Runtime getRuntime availablePro 2 ForkJoinTask Map Long InfoVO gt forkJoinTask ThreadPoolMa infoForkJoin submit newPriceTask skuIds 0 skuIds size infoSoaServi Map Long InfoVO

    2026年3月18日
    2
  • 中国银行笔试题目回忆录_中国银行好考吗

    中国银行笔试题目回忆录_中国银行好考吗亲,戳上面的蓝字关注我们哦!中国银行笔试回忆题目昨天刚考完的中国银行笔试题目,趁着头脑还比较清醒先在这里记录一下吧,我选的是中国银行的信息技术岗位。我是提前就进了考场,中国银行考场还是比较好的,还

    2022年8月3日
    15
  • MTK平台camera驱动架构分析

    MTK平台camera驱动架构分析MTK6580Andro android8 1 版本 camera 驱动分析 CAMERA 驱动整个框架分为 三个部分 hal 部分逻辑调用 kernel 层的通用驱动 sensorlist c 和具体 IC 的驱动 xxxx mipi raw c 这里主要介绍 kernel 部分和 HAL 层部分 camera 开机流程 poweron 上电开机 然后通过 i2c 地址匹配 i2c 通讯 rest 和 powerdown 上电

    2026年3月19日
    1
  • 两分钟学会在GitHub托管代码

    两分钟学会在GitHub托管代码本篇博客针对不会 Git 的小童鞋 大神们可以绕过 错误之处谢谢指正 关于 GitHub 的强大此处不在说明 知道 GitHub 也有一段时间了 但是一直苦于不会使用 本篇文章介绍的是如何将工程代码托管到上面 如果你还没注册 GitHub 账号请到 https github com 上注册如果你已经注册 GitHub 账号 在你的电脑上安装了 GitHub 而一直还没上传过代码 1 打开浏览器登

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号