字符串比较
String 类型不是基本类型,而是引用类型。Java 虚拟机为了提高效率并节约内存,对于具有相同字符序列的字符串直接量使用同一个实例。
通过 == 操作符只能判断两个字符串变量是否指向同一个对象,指向同一个对象内容肯定就一样了,这么想想好像是可以用 == 来进行字符串的比较,但是内容一样就一定指向同一个对象了吗?例如,下面语句:
String s1 = "piggy";
String s2 = "piggy";
String s3 = new String("piggy");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
输出结果为:
true
false
发现了吧,s3 和 s1 的内容是一样的,但 s3 是通过创建一个新的实例来创建一个字符串,s1 和 s3 指向的对象是不一样的,所以用 == 比较 s1 和 s3 的结果就是 false。而 s1 和 s2 是使用同一个实例 “piggy” 创建的字符串,所以指向的对象是相同的,所以结果是 true。
所以,如果要比较两个字符串的内容是否相同,我们不应该用双等号,我们可以使用 String 对象的比较方法。
方法 | 描述 |
---|---|
equals(s1) | 如果该字符串等于字符串 s1,返回 true |
equalsIgnoreCase(s1) | 如果该字符串等于字符串 s1,返回 true;不区分大小写 |
compareTo(s1) | 返回一个大于 0、等于 0、小于 0 的整数,表明一个字符串是否大于、等于或者小于 s1 |
compareToIgnoreCase(s1) | 和 compareTo 一样,除了比较是区分大小写的之外 |
startsWith(prefix) | 如果字符串以特定的前缀开始,返回 true |
endsWith(suffix) | 如果字符串以特定的后缀结束,返回 true |
contains(s1) | 如果 s1 是该字符串的子字符串,返回 true |
例如下面代码:
String s1 = "piggy";
String s2 = "piggy";
String s3 = new String("piggy");
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
输出结果为:
true
true