本篇博客主要针对初学者容易混淆的byte 和char 进行分析,其实只要我们好好复习下java的基本类型和几种常见的字符集,我们就会对这些疑问缝纫而解了,
1.1. Java内置的数据类型
Java 提供了 8 种基本类型。6 种数字类型( 4 个整数型,2 个浮点型),1 种字符类型,1 种布尔型。
byte:
首先明确一点,byte是Java 4个整数类型中的一个,是用来表示 Java 整数的,自然就会涉及到表示整数的范围,在内存中占几个字节的问题。
byte 数据类型用一个字节,也就是 8 位 表示、有符号的,以二进制补码表示的整数;
byte表示的整数范围为: 最小值是 -128(-2^7) 到 最大值是 127(2^7-1); 默认值是 0;
ASCII码就是用一个字节表示的,因此我们可以有:
对应的包装类: Byte.
Byte.Bytes
Byte.SIZE
Byte.MIN_VALUE
Byte.MAX_VALUE
new Byte(byte).short/int/long/float/doubleValue();
short:
short 是Java中第二个整数数据类型,
由 2 个字节 16 位表示、有符号的以二进制补码表示的整数
最小值是 -32768(-2^15) 到 最大值是 32767(2^15 - 1);默认值是 0;
对应的包装类:Short
Short.Bytes
Short.size
Short.MIN_VALUE
Short.MAX_VALUE
new Short(short).byte/short/int/long/float/doubleValue();
int:
int是 Java中第3个表示整数的类型,其表示的范围更大
int 数据类型是 4 个字节 32 位表示、有符号的以二进制补码表示的整数;
最小值是 -2,147,483,648(-2^31) 到 最大值是 2,147,483,647(2^31 - 1);默认值是 0;
对应的包装类: Integer
Integer.Bytes
Integer.SIZE
Integer.MIN_VALUE
Integer.MAX_VALUE
Integer.toBinaryString(int)
Integer.parseInt(String s, int radix);
long:
long是 Java中第 4 个表示整数的类型,其表示的范围更大
long 数据类型是 8 个字节 64 位表示、有符号的以二进制补码表示的整数;
最小值是 -9,223,372,036,854,775,808(-2^63)到 最大值是
9,223,372,036,854,775,807(2^63 -1);默认值是 0L;
当我们表示long类型是要在数字的末尾处加上L;
对应的包装类为 Long
Long.Bytes
Long.SIZE
Long.MIN_VALUE
Long.MAX_VALUE
Long.toBinaryString(int)
Long.parseInt(String s, int radix);
float:
对应的包装类: Float
double:
对应的包装类为: Double
char:
char类型是由 2 个字节 16 位表示的,没有符号,
char最小值是 \u0000(即为0)到 最大值是 \uffff(即为65,535);
char 数据类型可以储存任何字符;
char c1 = ‘A’;
char c2 = ‘中’ (中字 对应的int值也就是十进制值为20023)
char c3 =20023; (输出的c3就是对应的中字)
对应的包装类: Charcter
boolean:
1.1.1 自动类型转换:
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
注意:
1. 不能对boolean类型进行类型转换。
2. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
3. 转换过程中可能导致溢出或损失精度,例如:int i =128;
byte b = (byte)i;
4. 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
以下内容为转载内容:特此标识;
在下面的描述中,将以”中文”两个字为例,经查表可以知道其GB2312编码是”d6d0 cec4”,Unicode编码为”4e2d 6587”,UTF编码就是”e4b8ad e69687”。注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来”表示”。
2.1. iso8859-1
属于单字节编码,和ascii编码相似,最多能表示的字符范围是0-255,应用于英文系列。
很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然”中文”两个字不存在iso8859-1编码,以gb2312编码为例,应该是”d6d0 cec4”两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:”d6 d0 ce c4”(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节”e4 b8 ad e6 96 87”。很明显,这种表示方法还需要以另一种编码为基础。
2.2. GB2312/GBK
这就是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(单字节)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。
2.3. unicode
这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。
需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。
2.4. UTF
考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。 Unicode标准,它几乎涵盖了各个国家语言可能出现的符号和文字,并将为他们编号。Unicode的编号从0000开始一直到10FFFF共分为16个Plane,每个Plane中有65536个字符。而UTF-8则只实现了第一个Plane,可见UTF-8虽然是一个当今接受度最广的字符集编码,但是它并没有涵盖整个Unicode的字库。
2.4.1 UTF-8
它为变长编码。最小编码单位(code unit)为一个字节。一个字节的前1-3个bit为描述性部分,后面为实际序号部分。
并有以下规律: