1.5.3 字符串比较
如果要比较两个字符串是否相等,请使用equals方法。例如:
location.equals("World")
当location字符串恰好为"World"时,表达式将返回true。
警告:永远不要使用 == 运算符来比较字符串。在下面的比较中,仅当location和"World"在内存中是完全相同的对象时才能返回true。
location == "World" // Don’t do that!
即在虚拟机中,每个字符串字面量只用一个实例,因此只有"World" == "World" 才能为true。但如果location是被计算得到的,例如,
String location = greeting.substring(7, 12);
那么结果将会被放置到一个单独的String对象中,location == "World" 将返回false!
与其他任何对象一样,String变量可以是null。null表示这个变量不指向任何对象,甚至不指向一个空字符串。
String middleName = null;
如果要测试一个对象是否为null,可以使用 == 运算符:
if (middleName == null) ...
需要注意的是,null与空字符串""不同。空字符串是长度为零的字符串,而null表示根本不存在任何字符串。
警告:针对null调用任何方法都会导致“空指针异常”。和所有异常一样,如果你不显式地处理它,该异常会中断程序的运行。
提示:当将字符串与字符串字面量进行比较时,最好将字符串字面量放在前面,示例如下。
if ("World".equals(location)) ...
这样的优势在于,即使location为null,该测试也能正常工作。
如果在比较两个字符串时需要忽略字符的大小写,可以使用equalsIgnoreCase方法。例如:
"world".equalsIgnoreCase(location);
当location是"World"、"world"或者"WORLD"等情况时,都会返回true。
有时,你可能需要将字符串按顺序排列。调用compareTo方法可以判断两个字符串是否按字典顺序排列:
first.compareTo(second)
如果first在second之前,那么该方法返回一个负整数(不一定是−1);如果first在second之后,则返回正整数(不一定是1);如果两者相等,则返回0。
compareTo方法会依次比较每一个字符,直到其中一个字符串到达末尾,或者两个字符串不匹配。例如,当比较"word"和"world"时,前3个字符是匹配的,第4个字符d的Unicode值小于l。因此,"word"字符串在前。所以"word".compareTo("world") 返回−8,该值是d和l的Unicode值之间的差。
这种比较方式对很多人来说可能不是很直观,因为它取决于字符的 Unicode 值的大小。例如,"blue/green"在"bluegreen"之前,因为字符 / 的Unicode值恰好小于g的Unicode值。
提示:在对相对比较容易阅读的字符串进行排序时,可以使用支持特定语言排序规则的Collator对象。有关更多信息参见第13章。