/*
JDK5.0新特性:
以下的特性适合JDK1.5版本之后的。包括1.5
jdk1.4,包括1.4在内之前的所有版本不能使用以下特性。
自动装箱(auto_boxing)和自动拆箱(auto_unboxing)
*/


public class IntegerTest05{
	
	public static void main(String[] args){
		
		//JDK5.0之前的.
		
		//int-->Integer (装箱)
		Integer i1 = new Integer(10);
		
		//Integer-->int (拆箱)
		int i2 = i1.intValue();
		
		
		//JDK5.0之后,包括5.0
		Integer i3 = 10; //自动装箱
		int i4 = i3; //自动拆箱
		
		System.out.println(i3); //"10"
		System.out.println(i4+1); //11
		
		
		//JDK5.0之后
		m1(321); //自动装箱.
		
		System.out.println(m2(10,5) + 1); //自动装箱
	}
	
	
	public static void m1(Object o){
		System.out.println(o);
	}
	
	
	public static int m2(Integer i1,Integer i2){
		return i1 - i2; //自动拆箱
	}
}

//深入了解自动装箱和自动拆箱

/*
深入自动装箱和自动拆箱:
		
1.自动装箱和自动拆箱是程序编译阶段的一个概念,
和程序运行无关。
		
2.自动装箱和自动拆箱主要目的是方便程序员编码。
*/
public class IntegerTest06{
	
	public static void main(String[] args){
		
		Integer i1 = new Integer(10);
		Integer i2 = new Integer(10);
		
		//这里不会有自动拆箱
		System.out.println(i1==i2); //false
		
		//比较两个Integer类型的数据是否相等,不能用"=="
		//Integer已经重写了Object中的equals方法.
		System.out.println(i1.equals(i2)); //true
		
		
		//重点:
		Integer i3 = 128;
		Integer i4 = 128;
		
		//上面的等同于
		//Integer i3 = new Integer(128);
		//Integer i4 = new Integer(128);
		
		System.out.println(i3==i4); //false
		
		
		//注意以下程序.
		//如果数据是在(-128~127)之间,java中引入了一个“整型常量池”,在方法区中。
		//该整型常量池只存储-128~127之间的数据。
		Integer i5 = 127; //这个程序不会在堆中创建对象,会直接从整型常量池中拿.
		Integer i6 = 127;
		
		System.out.println(i5==i6); //true
		
		Integer i7 = -128;
		Integer i8 = -128;
		
		System.out.println(i7==i8); //true
		
		
		Integer i9 = -129;
		Integer i10 = -129;
		
		System.out.println(i9==i10); //false
	}
}