经常笔试的问题
int i = 10;
Integer i1 = 10;
Integer i2 = 10;
Integer i3 = new Integer(10);
Integer i4 = new Integer(10);
System.out.println(i==i1); //true
System.out.println(i==i3); //true
System.out.println(i1==i2); //true —->如果数字范围超过-128~127 则结果变为false
System.out.println(i1==i3); //false
System.out.println(i3==i4); //false
System.out.println(i1.equals(i2)); //true
System.out.println(i1.equals(i3)); //true
System.out.println(i3.equals(i4)); //true
1.==与equals()的区别
==可以比较基本数据类型 也可以比较引用数据类型(比较的都是变量中存储的内容)
若比较的是基本类型 比较的是变量存储的值
若比较的是引用类型 比较的是变量中存储的地址引用
注意 不同类型引用的==比较 会出现编译错误 不能比较 如 Long 和 Integer 类型的值不能比较
Integer是int的封装类 当Integer与int进行==比较时 Integer就会拆箱成一个int类型
所以这里的Integer 不管是直接赋值 还是new创建的对象 只要跟int比较就会拆箱为int类型 所以就是相等的
equals()只能比较引用类型
是Object类中继承过来的方法 每一个引用类型都可以调用
默认的equals()方法比较规则与==一致
但是Integer类重写了equals()方法 equals方法先比较类型 如果类型相同 再比较数值
2.Integer类加载的时候 自己有一个静态的空间
空间内立即加载 Integer类型的数组Integer[] 数组内存储256个Integer对象 -128~127
如果我们使用的对象范围在这之内 如Integer i1 = 10; 则直接在静态元素区里找对应的对象
如果我们使用的对象范围不在这之内 如Integer i1 = 128; 则系统会帮我们创建一个新的Integer对象