Java基本数据类型
|
类型
|
大小
|
范围/精度
|
|
byte
|
1字节
|
8位,最小值是
-128(-2^7)
; 最大值是
127(2^7-1)
|
|
short
|
2字节
|
16位,最小值是
-32768(-2^15)
; 最大值是
32767(2^15 - 1)
|
|
int
|
4字节
|
32位,最小值是
-2,147,483,648(-2^31)
; 最大值是
2,147,483,647(2^31 - 1)
|
|
long
|
8字节
|
64位,最小值是
-2^63
; 最大值是
2^63 -1
|
|
float
|
4字节
|
32位,单精度、32位、符合IEEE 754标准的浮点数
|
|
double
|
8字节
|
64位,双精度、64 位、符合IEEE 754标准的浮点数
|
|
char
|
2字节
|
单一的 16 位 Unicode 字符,最小值是
\u0000
(即为0);最大值是
\uffff
(即为65,535)
|
|
boolean
|
1位
|
1位,只有两个取值:true 和 false
|
更多了解可参考我的这个字符集编码与乱码专题:
字符集编码与乱码 - 肖国栋的i自留地
,里面有更详细的介绍,包括很多图示及代码的例子。
首先,你所谓的“字符”具体指什么呢?
如果你说的“字符”就是指 Java 中的 char,那好,那它就是 16 位,2 字节。
如果你说的“字符”是指我们用眼睛看到的那些“抽象的字符”,那么,谈论它占几个字节是没有意义的。
具体地讲,
脱离具体的编码谈某个字符占几个字节是没有意义的
。
就好比有一个抽象的整数“42”,你说它占几个字节?这得具体看你是用 byte,short,int,还是 long 来存它。 用 byte 存就占一字节,用 short 存就占两字节,int 通常是四字节,long 通常八字节。 当然,如果你用 byte,受限于它有限的位数,有些数它是存不了的,比如 256 就无法放在一个 byte 里了。
字符是同样的道理,如果你想谈“占几个字节”,就要先把编码说清楚。
同一个字符在不同的编码下可能占不同的字节
。
就以你举的“
字
”字为例,“
字
”在 GBK 编码下占 2 字节,在 UTF-16 编码下也占 2 字节,在 UTF-8 编码下占 3 字节,在 UTF-32 编码下占 4 字节。
不同的字符在同一个编码下也可能占不同的字节
。
“
字
”在 UTF-8 编码下占3字节,而“
A
”在 UTF-8 编码下占 1 字节。(因为 UTF-8 是
变长
编码)
而 Java 中的 char 本质上是 UTF-16 编码。而 UTF-16 实际上也是一个变长编码(2 字节或 4字节)。
如果一个抽象的字符在 UTF-16 编码下占 4 字节,显然它是不能放到 char 中的。换言之, char 中只能放 UTF-16 编码下只占 2 字节的那些字符。
而 getBytes 实际是做编码转换,你应该显式传入一个参数来指定编码,否则它会使用缺省编码来转换。
你说“ new String(“字”).getBytes().length 返回的是3 ”,这说明缺省编码是 UTF-8. 如果你显式地传入一个参数,比如这样“ new String(“字”).getBytes(“
GBK
”).length ”,那么返回就是 2.
你可以在启动 JVM 时设置一个缺省编码,
假设你的类叫 Main,那么在命令行中用 java 执行这个类时可以通过 file.encoding 参数设置一个缺省编码。 比如这样:java -D
file.encoding
=
GBK
Main 这时,你再执行不带参数的 getBytes() 方法时,new String(“字”).getBytes().length 返回的就是 2 了,因为现在缺省编码变成 GBK 了。 当然,如果这时你显式地指定编码,new String(“字”).getBytes(“
UTF-8
”).length 返回的则依旧是 3.
否则,会使用所在操作系统环境下的缺省编码。
通常,Windows 系统下是 GBK,Linux 和 Mac 是 UTF-8. 但有一点要注意,在 Windows 下使用 IDE 来运行时,比如 Eclipse,如果你的工程的缺省编码是 UTF-8,在 IDE 中运行你的程序时,会加上上述的 -D
file.encoding
=
UTF-8
参数,这时,即便你在 Windows 下,缺省编码也是 UTF-8,而不是 GBK。
由于受启动参数及所在操作系统环境的影响,不带参数的 getBytes 方法通常是不建议使用的,最好是显式地指定参数以此获得稳定的预期行为。
ASCII码:
一个
英文字母(不分大小写)
占
一个
字节
的空间,
一个
中
文汉字
占
两个
字节
的空间。
一个
二进制数字序列,在计算机
中
作为
一个
数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。如
一个
ASCII码就是
一个
字节
。
UTF-8编码:
一个
英文
字符
等于
一个
字节
,
一个
中
文(含繁体)等于三个
字节
。
Unicode编码:
一个
英文等于两个
字节
,
一个
中
文(含繁体)
(1)、英文和数字
占
一个
字节
(2)、
中
文
占
一个
字符
,也就是两个
字节
(3)、
字符
不等于
字节
。
字符
(char)是
Java
中
的一种基本数据类型,由 2 个
字节
组成,范围从 0 开始,到 2^16-1。
字节
是一种数据量的单位,
一个
字节
等于 8 位。所有的数据所
占
空间都可以用
字节
数来衡量。例如
一个
字符
占
2 个
字节
,
一个
int
占
4 个
字节
,
一个
double
占
8 个
字节
等等。1字
java
中
一个
char型的数据(也就是
一个
字符
)
占
两个
字节
。而
Java
中
常用的
字符
包括数字、英文字母、英文符号、
中
文汉字、
中
文符号等,若在
字符
串
中
包含里面的多种
字符
,它们是否都
占
两个
字符
呢?答案是否定的。
public class CharBytes {
public static void main(String[] args) {
String s1 = "1234567";// 7个数字
字符
byte[] b1 = s1.getBytes();
题主要区分清楚内码(internal encoding)和外码(external encoding)就好了。
内码是程序内部使用的
字符
编码,特别是某种
语言
实现其char或String类型在内存里用的内部编码;
外码是程序与外部交互时外部使用的
字符
编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或S
Java
里的char类型变量与C
语言
中
的不一样,是
占
两个
字节
的。这一点想必大家都知道。
但是,
Java
的
字符
串String类型里的每个
字符
到底
占
多少个
字节
呢?
是:不管是汉字还是英文字母,每个均
占
两个
字节
呢?
还是:每个汉字
占
两个
字节
,英文字母
占
一个
字节
呢?
看下面程序:
public class MyClass {
public static void main(