谈谈“==”和“equal”的区别是什么?
==:对于基本类型是进行值的比较,对于引用类型是进行引用的比较,因为==本质上是对内存地址进行比较。
equals:equals默认是进行引用的比较,一般情况,我们需要将equals进行重写,变成值的比较
代码示例如下:
String x = "HelloWorld";
String y = "HelloWorld";
String z = new String("HelloWorld");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
x和y都属于基本类型,使用**进行比较时,比较的是值,所以为true**。
而z属于引用类型==,x和z比较的引用地址不是同一个,因此为false。
使用equals时,比较的是引用的值。
从JVM角度来看
从JVM角度来看,
- 执行String x = "HelloWorld"时;是将基本类型“HelloWorld”放入了字符串常量池中,并赋值给x;
- 执行String y = "HelloWord"时;常量池中已经存在“HelloWorld”,则将池中的“HelloWorld”赋值给y,所以此时的x和y中的“HelloWorld”是同一个对象。
- 执行String z = new String(“HelloWorld”)时;这条语句是新建了一个对象,储存在JVM的堆中,因此此时的“HelloWorld”和xy中的“HelloWorld”对象不同,因此内存地址也不同。