public class TestInteger {


    /**
     * 将基本数据类型int赋值给Integer,正常情况下是不行的,但这里可以赋值成功,
     * 原因是JAVA内部隐式调用了Integer.valueOf()方法,将基本数据类型包装成了对象。
     * Integer.valueOf()方法与直接new Integer()有很大的不同。
     * 如果是直接new Integer()的话,a==b比较的是对象地址,肯定不相等。
     * 但通过Integer.valueOf()将基本数据类型转换为对象类型后,用“==”比较时有相等的情况。
     * 通过Integer.valueOf()的源码可以看到区别:
     * ##################################################
     *  public static Integer valueOf(int i) {
     *      if(i >= -128 && i <= IntegerCache.high)
     *          return IntegerCache.cache[i + 128];
     *      else
     *          return new Integer(i);
     *  }
     * ###################################################
	 * 当我们使用Integer.valueOf()将一个int类型数据转为Integer类型时,
	 * jvm首先会去常量池中查找有没有与它对应的对象。如果有,就拿到这个对象的引用返回,
	 * 如果没有,就新new一个对象返回。常量池的大小默认是-128~127,这个范围可以通过设置jvm参数修改。
	 * 也就是说,当被赋数值在-128~127之间的话,返回的Integer对象全部为同一个对象,使用“==”操作符比较是相等的。
	 * 如果超过了这个数值,返回的Integer对象就是新创建的对象,使用“==”操作符比较就不相等了。
	 * 结论:对象类型比较时,只能用equals方法!!!
     */
    @Test
    public void test1() {
        Integer a = 30;
        Integer b = 30;

        if(a == b){
            System.out.println(a+"=="+b);
        } else {
            System.out.println(a+"!="+b);
        }
    }

    @Test
    public void test2() {
        Integer a = 300;
        Integer b = 300;

        if(a == b){
            System.out.println(a+"=="+b);
        } else {
            System.out.println(a+"!="+b);
        }
    }

    @Test
    public void test3() {
        Integer a = new Integer(30);
        Integer b = new Integer(30);
        //“==”比较的是对象地址,所以不相等
        if(a == b){
            System.out.println(a+"=="+b);
        } else {
            System.out.println(a+"!="+b);
        }
    }

    @Test
    public void test4() {
        Integer a = new Integer(300);
        Integer b = new Integer(300);

        //“==”比较的是对象地址,所以不相等
        if(a == b){
            System.out.println(a+"=="+b);
        } else {
            System.out.println(a+"!="+b);
        }
    }
}