这种题一般就是考 内存地址是否一致 是否是同一个对象
i04 = new Integer(59); 这个是新new 出来的对象 肯定和其他的对象地址不一致
最简单的方式 用eclipse调试 很明显
C、System.out.println(i03== i04);
解释:
1.Integer与int比较相等时,会进行转换为int再比较,故i02与任何一个都会相等(基本数据类型没有对象,值相等就是相等)
2.jvm会为Integer预先分配一部分内存,在以后有请求Integer对象时,系统都会让它指向这个预分配好的Integer对象,但是i04明确指定了要new一个新的,则jvm会为它生成一个新的对象.,所以i01和i03都是预先分配的Integer,故而相等,而i04是新的Integer对象,故而不等。
C 显示为false 其他true
i01这样定义相当于把int型数59强制转换成Integer
i03和i04定义都是新声明一个对象
也就是说i01和i02在比较时都是int型的
int型之间的比较是直接比较的 int与Integer之间的比较都会转化成int型进行比较
Integer 之间的比较是对象进行比较 比较的是地址值 不同对象的地址值一定不同
System.out.println(i03.equals(i04)); // true 这样比较才是true
i01,i03,i04都是对象 ,对象的直接比较是比较内存地址 因为i01,i03的内存都是指向堆栈中的 i02
而 i02又可以自动转化成对象,因此 A,B 都是TRUE;
i04是new 的新对象,所以内存地址发生了变化,因此 C为false,
因 i02又可以自动转化成对象 所以 D为true;
C、System.out.println(i03== i04);
i02为基本数据类型,有基本数据类型的都是比较值,所以A、D为TRUE
i01和i03在-128--127之间分配机制是一样的,所以i01==i03
i03和i04分配内存的机制是不一样的