byte vs char 小结

本篇博客主要针对初学者容易混淆的byte 和char 进行分析,其实只要我们好好复习下java的基本类型和几种常见的字符集,我们就会对这些疑问缝纫而解了,


  1. Java 基本数据类型;
  2. 字符集;

  1. Java数据类型:
    1.1. Java内置数据类型;
    1.2. 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 b1 = 34;
    • byte b2 = ‘a’; (会输出 65,因为byte是表示小范围的整数)
    • System.out.println(” b1+b2 = “+(b1+b2))==>”~”= 34+65=99;
    • System.out.println(“b1+b2 = “+b1+b2)==>”~”= 3465;

对应的包装类: 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 s1=345;
    • short s2=’a’;(自动将byte类型转换成short类型了对应97)

对应的包装类: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 a = 100000L,Long b = -200000L。

对应的包装类为 Long

Long.Bytes
Long.SIZE
Long.MIN_VALUE
Long.MAX_VALUE
Long.toBinaryString(int)
Long.parseInt(String s, int radix);

float:

  • float是Java 中单精度,用4个字节 32位表示,例如:float f1 = 234.5f。

对应的包装类: Float


double:

  • double 数据类型是双精度、8 个字节 64 位表示、 默认值是 0.0d; 例子:double d1 = 123.4。

对应的包装类为: 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:

  • boolean数据类型表示一位的信息;只有两个取值:true 和 false;
  • 默认值是 false;
  • boolean one = true。

1.1.1 自动类型转换:
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。

转换从低级到高级。

低  ------------------------------------>  高

byte,short,char—> int —> long—> float —> double 

注意:
1. 不能对boolean类型进行类型转换。
2. 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
3. 转换过程中可能导致溢出或损失精度,例如:int i =128;
byte b = (byte)i;

4. 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入



  • Java 字符集
    2.1首先我们对ASCII码表有个清晰的记忆:ASCII表,其中:ASCII中的0~31为控制字符;32~126为打印字符;127为Delete(删除)命令,
  • 10 : 换行
  • 13 : 回车
  • 28 : 文件分隔符
  • 32 : space
  • 48 : 0
  • 59 : 9
  • 65 : A
  • 90 : Z
  • 97 : a
  • 122 : z
  • \n 换行 (0x0a)
  • \r 回车 (0x0d)
  • \f 换页符(0x0c)
  • \b 退格 (0x08)
  • \0 空格 (0x20)
  • \s 字符串
  • \t 制表符
  • \” 双引号
  • \’ 单引号
  • \ 反斜杠
  • \ddd 八进制字符 (ddd)
  • \uxxxx 16进制Unicode字符 (xxxx)

以下内容为转载内容:特此标识;


在下面的描述中,将以”中文”两个字为例,经查表可以知道其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为描述性部分,后面为实际序号部分。

  • 如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7个bit)代表在Unicode中的序号。
  • 如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间。110之后的所有部分(13个bit)代表在Unicode中的序号。且第二个字节以10开头
  • 如果一个字节以1110开头,那么代表当前字符为三字节字符,占用3个字节的空间。110之后的所有部分代表在Unicode中的序号。且第二、第三个字节以10开头
  • 如果一个字节以10开头,那么代表当前字节为多字节字符的第二个字节。10之后的所有部分(6个bit)代表在Unicode中的序号。

并有以下规律:

  • 3个字节的UTF-8十六进制编码一定是以E开头的
  • 2个字节的UTF-8十六进制编码一定是以C或D开头的
  • 1个字节的UTF-8十六进制编码一定是以比8小的数字开头的

你可能感兴趣的:(JAVA-SE)