1、Integer类的内部, 有一个常量静态数组, 在Integer类被加载的时候, 预先创建了-128 ~ 127的Integer对象, 所以当声明的Integer类型变量的值在-128 ~ 127的范围内时, 不会新创建对象, 直接引用数组中创建好的.
2、int是一个基本数据类型,不存在integer那样的创建对象的过程,只要数值不超过-2^31~2^31-1(对于32位的编译器来说),编译器就不会报错
3、“==”对于基本数据类型,比较的是值,对于引用数据类型,比较的是对象的地址值。equals比较的是对象的值是否相等。
一、
class Testa
{
public static void main(String[] args)
{
Integer a=new Integer(100);//新建了一个对象,值为100,并将对象的引用地址值赋给a
Integer b=100;//在堆中创建一个对象,存值为100,并将地址值赋给b
System.out.println(a==b);
}
}
对象不同,故地址值不同,所以结果为false(如图Testa)
二、
class Testb
{
public static void main(String[] args)
{
Integer a=100;//在堆中创建一个对象,存值为100,并将地址值赋给a
Integer b=100;//100的值没有超过-128~127,直接引用已经创建好的对象
System.out.println(a==b);
}
}
对象一样,故地址值相同,所以结果为true(如同Testb)
三、
class Testc
{
public static void main(String[] args)
{
Integer a=156;//在堆中创建一个对象,存值为156,并将地址值赋给a
Integer b=156;//156的值已超过-128~127,会重新创建新的对象值为156,并将地址值赋给b
System.out.println(a==b);
}
}
对象不同,故地址之不同,所以结果为false(如同Testc)
四、
class Testd
{
public static void main(String[] args)
{
Integer a=Integer.valueOf(100);//通过valueof(100)方法,获取的是已有对象的值,再将地址值赋给a
Integer b=100;
System.out.println(a==b);
}
}
对象一样,故地址值相同,所以结果为true(如同Testd)
|