一般认为Text类和String类是等价的,但二者之间其实存在着不小差别:
以《Hadoop权威指南》中的案例为例,给定字符串 String s = “\u0041\u00DF\u6771\uD801\uDC00”; //s打印出来为"Aß東?" ,字符串s由四个字符的Unicode编码组成:
Unicode编码
utf-8编码
utf-8编码所占字节数
A
\u0041
0010 1001 (41)
1Byte
ß
\u00DF
1101 1101 (223)
2Byte
東
\u6771
110 0111 0111 0001 (26481)
3Byte
?
\uD801\uDC00
1 0000 0100 0000 0000 (66560)
4Byte
对比一: Text对象的charAt( )方法返回的是当前位置字符对应的Unicode编码的位置(int类型),String对象返回的是当前位置对应的字符(char类型);
对比二: Text对象的长度是每个字符UTF-8编码所占字节数之和,String对象的长度对应char编码单元的个数;
对比三: Text对象的charAt( )方法与String对象的codePointAt( ) 方法更加类似,都返回当前位置字符对应的Unicode编码位置;
对比四: Text类的find( ) 方法返回的是当前位置的字节偏移量,String类的indexOf( )方法返回的是char编码单元中的索引位置。