本教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变更了解Java SE 9及后续版本中更新的语言特性摘要。
请参阅JDK发行说明了解所有JDK版本中的新功能、增强功能以及已删除或不推荐使用的选项信息。
为了编写适用于任何语言和脚本的代码,需要记住一些事情。
考虑因素 | 原因 |
---|---|
避免使用char 数据类型的方法。 |
避免使用char 原始数据类型或使用char 数据类型的方法,因为使用该数据类型的代码无法处理补充字符。对于接受char 类型参数的方法,应该使用相应的int 方法(如果有的话)。例如,使用Character.isDigit(int) 方法而不是Character.isDigit(char) 方法。 |
使用isValidCodePoint 方法验证码点值。 |
码点被定义为int 数据类型,允许超出0x0000到0x10FFFF有效码点范围的值。出于性能原因,接受码点值作为参数的方法不会检查参数的有效性,但是可以使用isValidCodePoint 方法来检查值。 |
使用codePointCount 方法计算字符数。 |
String.length() 方法返回字符串中代码单元或16位char 值的数量。如果字符串包含补充字符,则计数可能会误导,因为它不会反映真实的代码点数。要准确计算字符数(包括补充字符),请使用codePointCount 方法。 |
使用String.toUpperCase(int codePoint) 和String.toLowerCase(int codePoint) 方法而不是Character.toUpperCase(int codePoint) 或Character.toLowerCase(int codePoint) 方法。 |
Character.toUpperCase(int) 和Character.toLowerCase(int) 方法确实可以处理码点值,但是有一些字符无法进行一对一的转换。例如,德语的小写字符ß在转换为大写时会变成两个字符SS。同样,希腊小写Sigma字符在字符串中的位置不同而有所不同。Character.toUpperCase(int) 和Character.toLowerCase(int) 方法无法处理这些情况;然而,String.toUpperCase 和String.toLowerCase 方法可以正确处理这些情况。 |
删除字符时要小心。 | 在调用StringBuilder.deleteCharAt(int index) 或StringBuffer.deleteCharAt(int index) 方法删除索引指向补充字符的情况下,只会删除该字符的前半部分(第一个char 值)。首先,在字符上调用Character.charCount 方法以确定是否需要删除一个或两个char 值。 |
翻转字符序列时要小心。 | 在对包含补充字符的文本调用StringBuffer.reverse() 或StringBuilder.reverse() 方法时,高位和低位代理对会被颠倒,导致出现错误和可能无效的代理对。 |