Hadoop: Text類和String類的比較


一般認為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編碼單元中的索引位置。

 

 具體對比可參考以下代碼:

import org.apache.hadoop.io.Text;
import org.junit.Assert;
import org.junit.Test;

import java.io.UnsupportedEncodingException;

public class StringTextComparisonTest {

    @Test
    public void string() throws UnsupportedEncodingException {
        String s = "\u0041\u00DF\u6771\uD801\uDC00";   //"Aß東𐐀"
        System.out.println(s.codePointAt(1));

        // indexOf( )方法返回char編碼單元的索引位置
        Assert.assertEquals(s.indexOf("\u0041"), 0);
        Assert.assertEquals(s.indexOf("\u00DF"), 1);
        Assert.assertEquals(s.indexOf("\u6771"), 2);
        Assert.assertEquals(s.indexOf("\uD801\uDC00"), 3);

        // charAt( )方法返回當前位置對應的char類型字符
        Assert.assertEquals(s.charAt(0),'\u0041');
        Assert.assertEquals(s.charAt(1),'\u00DF');
        Assert.assertEquals(s.charAt(2),'\u6771');
        Assert.assertEquals(s.charAt(3),'\uD801');
        Assert.assertEquals(s.charAt(4),'\uDC00');

        // codePointAt( )方法返回當前位置對應的char類型字符在Uncoide編碼中的位置
        Assert.assertEquals(s.codePointAt(0),0x0041);  // utf-8編碼的位置,十六進制表示
        Assert.assertEquals(s.codePointAt(1),0x00DF);
        Assert.assertEquals(s.codePointAt(2),0x6771);
        Assert.assertEquals(s.codePointAt(3),0x10400);
        System.out.println(s.toString());

        // test length
        Assert.assertEquals(s.length(), 5);
        Assert.assertEquals(s.getBytes().length, 10);

    }

    @Test
    public void text(){

        // 這個字符串按照UTF-8方案編碼后所占的字節數是1+2+3+4(沒有\uDC00是因為找不到)
        Text t = new Text("\u0041\u00DF\u6771\uD801\uDC00");
        System.out.println(t.charAt(1));

        // find( )方法返回的是字符的字節偏移量
        Assert.assertEquals(t.find("\u0041"), 0);
        Assert.assertEquals(t.find("\u00DF"), 1);
        Assert.assertEquals(t.find("\u6771"), 3);
        Assert.assertEquals(t.find("\uD801\uDC00"), 6);
        Assert.assertEquals(t.find("\uDC00"), -1);

        // charAt( )方法返回對應的Unicode編碼的位置
        Assert.assertEquals(t.charAt(0),0x0041);
        Assert.assertEquals(t.charAt(1),0x00DF);
        Assert.assertEquals(t.charAt(3),0x006771);
        Assert.assertEquals(t.charAt(6),0x10400);


        System.out.println(t.toString());
        Assert.assertEquals(t.getLength(), 10);
    }

}

  2018-01-03 10:40:28

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM