Java中==与equals方法的测试
代码
/**
* 测试 == 和 equals方法 在基本数据类型和引用类型之间的判断.
* 1. == 比较的是值。如果是基本数据类型,比较的就是数值;如果是引用类型,比较引用指向的地址
* 2. equals() 默认比较的是地址,此方法最初定义在Object类中,方法的实现是比较地址。在String
* 类中重写了此方法,使其比较的是内容。
*/
public class demo1 {
public static void main(String[] args){
String s1 = new String("ab");
String s2 = new String("ab");
// == 比较引用类型,比较的是引用指向的地址。由于s1和s2是由new分别创建的两个对象,所以
// 它们在堆中的地址不同,因此下面语句输出 false
System.out.println(s1==s2);
// equals() 默认比较的也是地址,但String类重写了该方法,是的String类中的equals()方法
// 比较的是内容。因此下面语句输出 true
System.out.println(s1.equals(s2));
String s3 = "ab";
String s4 = "ab";
// s3和s4都是引用数据类型,但"ab"是保存在常量池中的,它们都指向的是常量池中同一个地址
// 下面语句结果输出true
System.out.println(s3 == s4);
// 同样是比较两个地址,s3指向的是常量池中的地址,s1指向的是堆中的地址。结果为false
System.out.println(s3 == s1);
String s5 = "abab";
String s6 = s3 + s4;
// s5保存的是指向常量池的地址;s6保存的是指向堆中对应对象的空间,因为字符串是不可变对象,
// 无法直接通过相加而相连接,所以在进行相加操作时,实际上做的是:创建一个新的字符串对象,
// 通过 new StringBuilder()来创建。结果是false
System.out.println(s5 == s6);
final String s7 = "ab";
final String s8 = "ab";
String s9 = s7 + s8;
// final关键字修饰后,s7和s8都由变量变为了常量,编译器处理常量运算时会作出优化,
// 将运算后的结果转为常量, 然后再将常量结果赋给s9。下面语句结果为true
System.out.println(s9 == s5);
final String s10 = s3 + s4;
// s3 + s4是两个字符串对象相加,它们通过 new StringBuilder() 创建一个新的对象,然后
// 将此对象的地址给 s10, 然后final关键字将s10转为常量,但s10始终保存的是指向堆中的地址
// s5是指向常量池的地址。下面语句结果为false.
System.out.println(s5 == s10);
}
}