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类的区别的更多相关文章
- Java之String类
String类概述 java.lang.String 类代表字符串.Java程序中所有的字符串文字(例如 "abc" )都可以被看作是实现此类的实例.其实就是说:程序当中所有的双引 ...
- 慕课网-Java入门第一季-6-7 使用 Arrays 类操作 Java 中的数组
来源:http://www.imooc.com/code/1556 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现 ...
- 20155312张竞予 20170510实践一:在IDEA中以TDD的方式对String类和Arrays类进行学习
实践题目 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Arrays类 sort binarySea ...
- 字符串类为JAVA中的特殊类
字符串类为JAVA中的特殊类,String中为final类,一个字符串的值不可重复.因此在JAVA VM(虚拟机)中有一个字符串池,专门用来存储字符串.如果遇到String a=”hello”时(注意 ...
- 使用 Arrays 类操作 Java 中的数组
Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现数组的排序.搜索等(关于类和方法的相关内容在后面的章节中会详细讲解滴 ...
- 20175212童皓桢 在IDEA中以TDD的方式对String类和Arrays类进行学习
20175212童皓桢 在IDEA中以TDD的方式对String类和Arrays类进行学习 要求 在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 ...
- java.lang.String 类的所有方法
java.lang.String 类的所有方法 方法摘要 char charAt(int index) 返回指定索引处的 char 值. int codePointAt(int index) 返回指定 ...
- [解决]RESTEASY003215: could not find writer for content-type text/html type: java.lang.String
一.问题描述 1)项目一开始采用JAX-RS 2.1+Jersey 2.26调用REST服务能正常调用并获得正确响应: 2)当项目引入dubbo 2.6.2后也用到rest而dubbo要用到RESTE ...
- JDK1.8源码(三)——java.lang.String 类
String 类也是java.lang 包下的一个类,算是日常编码中最常用的一个类了,那么本篇博客就来详细的介绍 String 类. 1.String 类的定义 public final class ...
随机推荐
- jmeter 建立一个网络服务的测试计划
如何创建一个 测试计划 测试一个网络服务. 你会 创建5个用户发送请求到一页. 同时,你会告诉用户运行测试两次. 的总数 请求用户请求(5)x(1)x(重复2次)= 10 HTTP请求. 来 建立测试 ...
- 原生JavaScript实现mouseenter
mouseenter和Mouseleave都是jquery的事件,JavaScript的mouseover和mouseout每个子元素都会触发,从子元素移到父元素也会触发,用起来不很方便,而且触发的太 ...
- 集合框架,ArrayList和Vector的区别,让arrayList线程安全的几种方案
boolean add(E e) 将指定的元素添加到此列表的尾部. void add(int index, E element) 将指定的元素插入此列表中的指定位置. boolean addAll(C ...
- 客户信贷管理&临时授信
信贷额度的组成:假如某客户信用限额1万:开出销售订单时锁定1万:一旦发货1万,销售订单1万限额释放,变成发货锁定限额1万.一旦开票,发货1万限额释放,应收锁定1万限额.清帐成功,应收释放1万.信用限额 ...
- Python eclipse开发环境搭建
http://jingyan.baidu.com/article/cd4c2979101f02756f6e6064.html http://jingyan.baidu.com/article/1876 ...
- VS输入输出基本操作以及数据类型和类型转换
(一) C#项目的组成结构 项目结构 .config ---配置文件(存放配置参数文件) .csproj ---项目文件(管理文件项) .sln ---解决方案文件(管理项目) .cs - ...
- netty4 断线重连
转载:http://www.tuicool.com/articles/B7RzMbY 一 实现心跳检测 原理:当服务端每隔一段时间就会向客户端发送心跳包,客户端收到心跳包后同样也会回一个心跳包给服务端 ...
- cl.exe
http://blog.csdn.net/happyanger6/article/details/7589016
- Java:标示符 基本数据类型
标示符: 在程序中自定义的一些名称,例如:变量.类名.方法名…… 组成有数字0~9.大小写英文字母.“$”和下划线“_”组成,且不能由数字开头,以及不能使用java已使用和保留的关键字. Java中的 ...
- Python中的*args和**kwargs
原文地址:http://www.linuxidc.com/Linux/2011-10/45083.htm 先来看个例子: ,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a ...