Demo
基本类型
public class ObjectDemo {
public static void main(String[] args) {
int a=
57;
int b=
67;
int c=
124;
int d=
124;
System.
out.println(a==b);
System.
out.println((a+b)==c);
System.
out.println(c==d);
}
}
运行结果: 注:基本类型时,==比较的是值是否相等。
引用类型
public class ObjectDemo {
public static void main(String[] args) {
String s1=
new String(
"hello");
String s2=
new String(
"world");
String s3=
new String(
"helloworld");
String s4=
new String(
"helloworld");
System.
out.println(s1==s2);
System.
out.println((s1+s2)==s3);
System.
out.println(s3==s4);
System.
out.println(
"-----------");
System.
out.println(s1.equals(s2));
System.
out.println(s3.equals(s1+s2));
System.
out.println(s3.equals(s4));
}
}
运行结果: 注:引用类型:==比较的是值地址是否相等,而equals()比较的是值是否相等!
结果分析:
==:s1、s2、s3、s4像这种new出来的(即通过基本类的构造函数赋值的),最开始在堆中分配4个不同的内存空间,用于存放其在常量池中返回的地址,其在堆中地址自然完全不同;而s1和s2在拼接时,会先在常量池中开辟一个新空间,在进行拼接。三个比较地址都不同,所以均为false!equals():s1、s2、s3、s4像这种new出来的(即通过基本类的构造函数赋值的),最开始在堆中分配4个不同的内存空间,其地址自然完全不同;但是equals()比较的是类对象值是否相等。所以结果为false、true、true!
自动拆箱、int与Integer比较方法
public class ObjectDemo {
public static void main(String[] args) {
int i=
57;
Integer i1=
new Integer(
57);
Integer i2=
new Integer(
67);
Integer i3=
new Integer(
124);
Integer i4=
new Integer(
124);
System.
out.println(i==i1);
System.
out.println(i1==i2);
System.
out.println((i1+i2)==i3);
System.
out.println(i3==i4);
}
}
运行结果:
注:
两个Integer类型对象在做四则运算时会先进行自动拆箱,将Integer拆箱成int类型数据,然后做四则运算。int类型与Integer对象比较时会将Integer对象自动拆箱成int类型数据,然后比较值大小,相同则返回true。Integer对象与Integer对象做比较时是直接比较值地址。
结果分析:由以上可知,true、false、true,false。对于第三个输出结果为true是因为,i1,i2自动拆箱做加法后类型为int,int类型与Integer对象作比较如上注2,则结果为true。
总结
==: 基本类型:==比较的是值得大小。 引用类型:比较的是值地址是否相同equals(): 默认情况:即object类中equals()方法比较的是地址是否相同。 重写equals():象Integer、Double、String等类都是重写了equals()方法的,这种情况下equals()是比较的是值是否相同。
参考
自动拆箱、自动装箱见: http://blog.csdn.net/ZhouHuoCleverset/article/details/61676472#t5 String s=new String(“hello”)与String s=”hello”的区别?即new出来与直接赋值的区别请参考: http://blog.csdn.net/zhouhuocleverset/article/details/61935578
转载请注明原文地址: https://ju.6miu.com/read-37549.html