hadoop中Text类 与 java中String类的区别

hadoop 中
的Text类与java中的String类感觉上用法是相似的,但两者在编码格式和访问方式上还是有些差别的,要说明这个问题,首先得了解几个概念;

字符集:
是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。例如
unicode就是一个字符集,它的目标是涵盖世界上所有国家的文字和符号;

字符编码:是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。通常人们用符号集合(一般情况下就是文字)来表达信息。而以计算机为基础的信息处理系统则是利用元件(硬件)不同状态的组合来存储和处理信息的。元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。

字符编码与字符集通常是一一对应的关系,例如utf-8,utf-16,utf-32都是unicode的不同编码格式;

utf-8: 将unicode字符集分成1~4个字节的形式表示

utf-16:
将unicode中编号从1到65536的字符都用两个字节表示(因为前65536个被认为是常用字符),大于65536的字符通过变换的方法变成4个字节来存储;

utf-8 与 utf-16具体的编码变换方法,大家感兴趣的话可以从网上搜索来看;

Hadoop中的Text类为了与外界更好的交互,采用的是utf-8的编码,而java的char,String,StringBuffer则默认使用的是utf-16编码;两者在使用和访问的时候其实是有一些差别的。
这里借用了网上一篇博客中的例子
: http://blog.csdn.net/lastsweetop/article/details/9249411
来说明Text类与String类在访问上的区别

第一个行表示unicode字符集中的序号(也是以16进制表示),第二行表示的是采用utf-8编码的情况,第三行表示的是用utf-16编码的情况,可以看到,第四个字符在utf-16编码下也占用4个字节(两个char单元,每个char单元是两字字节);

代码如下,下面会分别解释结果中每一行的意思;

String str = "\u0041\u00DF\u6771\uD801\uDC00";

Text text = new Text("\u0041\u00DF\u6771\uD801\uDC00");

System.out.println(str.length());

System.out.println(str.getBytes("UTF-8").length);

System.out.println(str.indexOf("\u0041"));

System.out.println(str.indexOf("\u00DF"));

System.out.println(str.indexOf("\u6771"));

System.out.println(str.indexOf("\uD801\uDC00"));

System.out.println(str.charAt(0)==‘\u0041‘);

System.out.println(str.charAt(1)==‘\u00DF‘);

System.out.println(str.charAt(2)==‘\u6771‘);

System.out.println(str.charAt(3)==‘\uD801‘);

System.out.println(str.charAt(4)==‘\uDC00‘);

System.out.println(str.codePointAt(0));

System.out.println(str.codePointAt(1));

System.out.println(str.codePointAt(2));

System.out.println(str.codePointAt(3));

System.out.println(text.getLength());

System.out.println(text.find("\u0041"));

System.out.println(text.find("\u00DF"));

System.out.println(text.find("\u6771"));

System.out.println(text.find("\uD801\uDC00"));

System.out.println(text.charAt(0));
System.out.println(text.charAt(1));

System.out.println(text.charAt(3));

System.out.println(text.charAt(6));

5 //String
中的getLength表示的是字符串中char单元的个数,如果String中包含4个字节(两个char单元)表示的字符,像上文中的第四个字符,getLength也是统计的是char
    的数量,此时getLength的结果与实际的字符数是不同的。
10 //getBytes()
方法返回根据相应编码(此例为utf-8)编码后的字节数;四个字符按utf-8编码后的字节数分别为1、2、3、4,所以总的字节数是10
0 //String
的indexOf方法返回的字符出现的位置;
1
2
3
true
 //String的charAt方法,返回的是相应位置的char编码单元
true 
true
true
true
65
 //String类的codePointAt()方法返回的是对应位置的unicode字符集序号,即上文u+0041的十进制表示;
223
//
26481
66560
//这里要特别强调一下,由于第四个字符占据了两个char单元,codePointAt()方法会进行相应的判断,如果发现之后一位的char单元与当前位置的char单元是从属于一个
           
 unicode字符的话,就将两者和在一起;如果不是的话,就单独输出当前的char单元;
10 //Text
类的getLength方法返回的是utf-8编码之后的字节数
0
 //Text类的find方法也是按照字节数的偏移位置来的
1
3
6
65
 //Text类的charAt方法也是返回对应的unicode字符集序号;
223 
26481
66560
//如果这一句换成 charAt(5) 那么返回的是 -1

由于Text的特点决定了:对Text的遍历会麻烦一些,需要变成bytes后通过bytesToCodePoint()方法进行访问;

ByteBuffer buffer = ByteBuffer.wrap(text.getBytes(), 0, text.getLength());

int cp;
while (buffer.hasRemaining() && (cp =
Text.bytesToCodePoint(buffer)) != -1) {

  System.out.println(Integer.toHexString(cp) + "haha");

}

输出结果为:

41
df
6771
10400

hadoop中Text类 与 java中String类的区别,布布扣,bubuko.com

时间: 2024-10-27 07:54:39

hadoop中Text类 与 java中String类的区别的相关文章

慕课网-Java入门第一季-6-7 使用 Arrays 类操作 Java 中的数组

来源:http://www.imooc.com/code/1556 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等(关于类和方法的相关内容在后面的章节中会详细讲解滴~~). Arrays 中常用的方法: 1. 排序 语法:  可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该数组的排序(按升序排列),如: 运行结果: 2. 将数组转换

Java基础---使用Arrays类操作Java中的数组(三十二)

使用 Arrays 类操作 Java 中的数组 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等(关于类和方法的相关内容在后面的章节中会详细讲解滴~~). Arrays 中常用的方法: 1. 排序 语法:  可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该数组的排序(按升序排列),如: 运行结果: 2. 将数组转换为字符串 语法: 

java.lang.String 类的所有方法

java.lang.String 类的所有方法 方法摘要 char charAt(int index) 返回指定索引处的 char 值. int codePointAt(int index) 返回指定索引处的字符(Unicode 代码点). int codePointBefore(int index) 返回指定索引之前的字符(Unicode 代码点). int codePointCount(int beginIndex, int endIndex) 返回此 String 的指定文本范围中的 Un

【java】String类的基本方法

Java的String类基本方法 一.构造函数 函数 返回值 作用 String(byte[] bytes) String 通过byte数组构造字符串对象 String(char[] chars) String 通过char数组构造字符串对象 String(String string) String 拷贝一个值为string的字符串对象 String(StringBuffer buffer) String 通过StringBuffer构造字符串对象 二.String类的基本方法 函数 返回值 作

当写listview的onItemClick的方法时写Toast的参数context写成this出现can't resolve method ’make text(OnClickListener,java.lang.String,int)'的错误,原因

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Fruit fruit = fruitList.get(position); //Toast.makeText(this,fruit.getName(),Toast.L

java笔记--String类对象解析与运用

1.String中的equals和==的区别 String是对象而非基本数据类型,不能使用"=="来判断两个字符串是否相当, 判断两个字符串内容是否相同用equals(); 判断两个字符串内存地址是否相同用"==" 2.startsWith(String str): 判断字符串是否以str为前缀 3.endsWith(String str): 判断字符串是否以str为后缀 4.String 字符串的比较: 1).compareTo()和compareToIgnore

JAVA的String 类【转】

String类 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s = “Java语言”; 其实按照面向对象的标准语法,其格式应该为: String s = new String(“abc”); s = new String(“Java语言”); 只是按照面向对象的标准语法,在内存使用上存在比较大的浪费.例如String s = new String(“abc”);

java的String类入门

java的String类入门 1. 概述 只要是用双引号括起来的都叫字符串 String类在包java.lang.String中,只要是java.lang中的包,在写程序时都不需要import进来 字符串的内容一旦创建,将不可再改变,是一个常量 正是因为字符串不可改变,所以字符串是可以共享使用的.想想如果共享的东西大家可以随便修改,用一次残一次,谁还想去共享呀,想想都恶心,共享单车大家都可以用,就代表用的时候可以随便糟蹋它,拆它??? 字符串效果上相当于是char[]字符数组,但是底层原理是by

Java之String类常用API

目录 Java之String类常用API char chatAt(int index) int length() char[] toCharArray() String(char value[]) String(char value[], int offset, int count) int compareTo(String anotherString) String concat(String str) boolean contains(CharSequence s) boolean ends