关于包装类及==equals的一些误区
Integer i1=10; Integer i2=10; Integer i3=new Integer(10); Integer i4=new Integer(10); System.out.println(i1==i2); System.out.println(i1==i3); System.out.println(i3==i4); System.out.println(i1.equals(i2)); System.out.println(i1.equals(i3)); System.out.println(i3.equals(i4)); /** * 输出结果: true false false true true true 分析:首先区别==跟equals,==如果是比较的基本数据类型,则比较的是值,如果比较的引用类型则比较的是内存地址 equals所有类默认继承自object,object中的equals跟==是一样的,这里的equals是Integer中被重写后的,比较的是值 第一个i1==i2为ture:这里jvm自动将10装箱转换为Integer类型,并且这个10是一个Integer对象而不是数值,i1跟i2的10并非来自常量区,而是Integer自己的静态区中 Integer类加载的时候自己有一个静态空间,空间里的静态块立即加载了一个Integer类型的数组,里面存储的256个Integer对象,取值范围是byte的取值范围即-128->127 第二个为false:因为i1指向的是自己的静态空间的对象10的地址,i3则是通过new关键字在堆内存中开辟的内存空间指向的地址。 第三个为false:同上,i3,i4都是通过new在堆中开辟的两个不同的空间,地址当然也不同 四五六都为true:这里的equals比较的是值,i1,i2,i3,i4存储的都是对象10 误区:如果i1=128,i2=128那么,第一个为false,原因是如果我们的取值在-128->127这个范围,则使用的是Integer自带的数组中Integer对象 如果超过这个范围则会自动帮我们new一个,即i1=128等价i1=new Integer(128); */