Java程序中测试两个变量是否相等的两个方式:一种是利用==运算符,另一种是利用equals方法。
当使用==来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数据类型(不一定要求数据类型严格相同),则只要两个变量的值相等。就将返回true。
但如果是两个引用类型变量,它们必须指向同一个对象时,==判断才会返回true。==不可用于比较类型上没有父子关系的两个对象。
public class EqualTest
{
public static void main(String[] args)
{
int it = 65;
float fl = 65.0f;
//将输出true
System.out.println("65和65.0f是否相等?" + (it == fl));
char ch = 'A';
//将输出true
System.out.println("65和'A'是否相等?" + (it == ch));
String str1 = new String("hello");
String str2 = new String("hello");
//将输出false
System.out.println("str1和str2是否相等?"
+ (str1 == str2));
//将输出true
System.out.println("str1是否equals str2?"
+ (str1.equals(str2)));
//由于java.lang.String与EqualTest类没有继承关系,
//所以下面语句导致编译错误
System.out.println("hello" == new EqualTest());
}
}
JVM常量池保证相同的字符串直接量只有一个,下面是JVM使用常量池管理字符串直接量的情形:
public class StringCompareTest
{
public static void main(String[] args)
{
//s1直接引用常量池中的"疯狂Java"
String s1 = "疯狂Java";
String s2 = "疯狂";
String s3 = "Java";
//s4后面的字符串值可以在编译时就确定下来
//s4直接引用常量池中的"疯狂Java"
String s4 = "疯狂" + "Java";
//s5后面的字符串值可以在编译时就确定下来
//s5直接引用常量池中的"疯狂Java"
String s5 = "疯" + "狂" + "Java";
//s6后面的字符串值不能在编译时就确定下来,
//不能引用常量池中的字符串
String s6 = s2 + s3;
//使用new调用构造器将会创建一个新的String对象,
//s7引用堆内存中新创建的String对象
String s7 = new String("疯狂Java");
//输出true
System.out.println(s1 == s4);
//输出true
System.out.println(s1 == s5);
//输出false
System.out.println(s1 == s6);
//输出false
System.out.println(s1 == s7);
}
}