Java中的String字符串类,可以用来存储字符串。那么定义两个字符串类如何进行比较呢?
1. 用 ==
假如是基本数据类型的对象用==进行比较是很有效的,因为比较的就是数值。而对于引用数据类型的话,比较的却是地址。
这就是下面三个比较输出boolean值不同的原因之一。
public class StringTest {
public static void main(String[]args) {
String string01 = "csdnyyds";
String string02 = "csdnyyds";
System.out.println(string01 == string02); //true
String string11 = "csdnyyds";
String string12 = new String("csdnyyds");
System.out.println(string11 == string12); //false
String string21 = new String("csdnyyds");
String string22 = new String("csdnyyds");
System.out.println(string21 == string22); //false
}
}
输出结果为:
另外,因为字符串是常量,直接初始化的话,字符串引用会指向堆中字符串常量池里的字符串对象,如果新初始化的值在字符串常量里有,就不会重新创建一个,会指向同一个对象。而new出来的对象指向的是堆里的某个字符串对象。
下图表示的上述代码部分的对象
如果两个比较的字符串对象指向的是同一个字符串对象,那么就可以是true,否则为false。
在对两个字符串比较中,"=="不推荐使用,很容易使得出的值和理想值不同。
2.用equals方法。
从Object类继承下来的equals和hashCode方法,String类覆盖重写了。所以只需要两个字符串字面量相等使用equals方法比较就可以返回boolean值 true。当然,字面量相等的话,hashCode的值也相等。 相对与==推荐使用此方法进行两个字符串比较。
public static void main(String[]args) {
String string01 = "csdnyyds";
String string02 = "csdnyyds";
System.out.println(string01.equals(string02)); //返回true
String string11 = "csdnyyds";
String string12 = new String("csdnyyds");
System.out.println(string11.equals(string12)); //返回true
String string21 = new String("csdnyyds");
String string22 = new String("csdnyyds");
System.out.println(string21.equals(string22)); //返回true
}
运行结果:
3.用compareTo方法
前面两种都是返回boolean值,使用compareTo方法进行两个字符串比较的话就是返回int类型的值。通过返回值可以粗略的判断哪个字符串"大"。从左到右以此比较字符串。如何判定谁大谁小遵循Unidecode编码集所对应的数字。
String类定义的compareTo方法:
String类之所以有这个方法是因为String类实现了Comparable接口,并且重写了其中的compareTo()方法。你也可以自己定义一个类实现Comparable接口然后重写compareTo()方法。
public class StringTest1 {
public static void main(String[]args) {
String string01 = "1csdnyyds";
String string02 = "2csdnyyds";
System.out.println(string01.compareTo(string02)); //返回-1
String string11 = "1csdnyyds";
String string12 = new String("1csdnyyds");
System.out.println(string11.compareTo(string12)); //返回0
String string21 = new String("2csdnyyds");
String string22 = new String("1csdnyyds");
System.out.println(string21.compareTo(string22)); //返回1
}
}
输出结果:
出现了不同的数字。例如str1.compareTo(str2)。str1>str2就会返回一个正数,str1=str2就会返回0,str1<str2就会返回一个负数。
总结:两个字符串比较可以选择返回boolean类型的equals方法,具有粗略判断大小返回数值的compareTo方法。尽量不要使用==。