Java基础系列文章
最小的数据单位
,表示二进制的一位,只能取0
或1
。其英文缩写为小写字母b
(如100b)基本的数据存储单位
,1字节由8个比特组成,即1 Byte = 8 bit
。其缩写为大写字母B
(如100B)单位 | 缩写 | 大小 |
---|---|---|
1 字节 | 1 Byte (B) | 8 bit (b) |
1 千字节 | 1 KB | 1024 Bytes |
1 兆字节 | 1 MB | 1024 KB |
1 吉字节 | 1 GB | 1024 MB |
1 太字节 | 1 TB | 1024 GB |
网络传输速率(如带宽)
十进制
换算:100Mbps宽带的理论最高下载速度为二进制
换算:100Mbps宽带为数据存储容量或传输量
kB/s
或MB/s
表示int
‘l’或‘L’
后缀 -1~-128
;正数(128个):0~127
节省内存
的场景,如处理文件或网络数据流类型 | 位数 | 取值范围 | 默认值 | 包装类 |
---|---|---|---|---|
byte | 8 | -27 ~ 27-1(-128~127) | 0 | Byte |
short | 16 | -215 ~ 215-1(-32768 ~ 32767) | 0 | Short |
int | 32 | -231 ~ 231-1(约21亿多) | 0 | Integer |
long | 64 | -263 ~ 263-1(-9223372036854775808 ~ 9223372036854775807) | 0L | Long |
不同整数类型的存储空间和表示数值的范围:
double
‘f’或‘F’
后缀十进制数
形式:如:5.12、512.0f、 (必须有小数点)科学计数法
形式:如:5.12e2()、100E-2(
即
)
精度丢失
问题,金融计算建议使用BigDecimal
类型 | 位数 | 取值范围 | 精度 | 默认值 | 包装类 |
---|---|---|---|---|---|
float | 32 | 约±3.4e38( ± 3.4 × 10 38 ±3.4 \times 10^{38} ±3.4×1038) | 约 6~7 位十进制有效数字 | 0.0f | Float |
double | 64 | 约±1.7e308( ± 1.7 × 10 308 ±1.7 \times 10^{308} ±1.7×10308) | 约 15~16 位十进制有效数字 | 0.0d | Double |
)约 6~7 位十进制有效数字0.0fFloatdouble64约±1.7e308(
)约 15~16 位十进制有效数字0.0dDouble
关于精度举例说明:
float f = 0.123456789f;
double d = 0.123456789123456789;
System.out.println(f); // 输出:0.12345679(只有前 7 位是可靠的)
System.out.println(d); // 输出:0.12345678912345678(保留了更多有效数字)
关于浮点型精度的说明:
固定长度的2字节
,即使是中文、英文或其他字符常用汉字
:在Java内存中用一个char表示,占2个字节
扩展汉字(生僻字)
:超出char表示范围,用两个char表示,占4个字节
UTF-8
编码形式存储(如写入文件或通过网络传输),一个汉字通常会占用3个字节
(生僻字可能是4个字节
)类型 | 位数 | 取值范围 | 默认值 | 包装类 |
---|---|---|---|---|
char | 16 | 0 ~ 65535(Unicode) | ‘\u0000’ | Character |
进行运算
的。因为char类型都对应有Unicode码,可以看做是一个数值char c12 = 'a'; // ASCII对应数字97
char c13 = 65; // 这里就是ascii码65,对应字符A
System.out.println(c12+c13); // 97+65=162
//使用一对''表示,内部有且仅有一个字符
char c1 = 'a';
char c2 = '中';
char c3 = '1';
char c4 = '%';
char c5 = 'γ';
//编译不通过
//char c6 = '';
//char c7 = 'ab';
\u
开头加4位十六进制
表示Unicode编码\u + 纵坐标 + 横坐标
如:\u0040
表示为@转义字符 | 说明 | Unicode表示方式 |
---|---|---|
\n | 换行符 | \u000a |
\t | 制表符 | \u0009 |
\" | 双引号 | \u0022 |
\' | 单引号 | \u0027 |
\\ | 反斜线 | \u005c |
\b | 退格符 | \u0008 |
\r | 回车符 | \u000d |
char c = 65; // ASCII 码 65 对应 'A'
System.out.println(c); // 输出: A
char ch = 0x4F60; // 十六进制 Unicode 表示 '你'
System.out.println(ch); // 输出: 你
类型 | 位数 | 取值范围 | 默认值 | 包装类 |
---|---|---|---|---|
boolean | 1 | true/false | false | Boolean |
Java 语言规范未强制规定 boolean 的大小,仅表示其表示 1 位信息,具体实现由虚拟机决定
。这导致不同 JVM 的差异:
通常占用 4 字节
:根据《Java 虚拟机规范》,单独使用的 boolean 值在编译时会被转换为int 类型(占用 4 字节)
,以提高 32 位处理器的存取效率。例如,局部变量或方法栈中的 boolean 变量可能按 int 处理可能占用 1 字节
:部分虚拟机(如 HotSpot)在存储对象的成员变量时,可能将 boolean 字段压缩为 1 字节
。例如,Oracle 的某些 JVM 实现中,boolean 字段实际占用 1 字节数组元素
:统一为1 字节
(编码为 byte 数组)自动完成
示例:
int a = 10;
long b = a; // 自动转换:int → long
double c = b; // 自动转换:long → double
int x = 5;
double y = x + 3.14; // 结果为 double 类型
char ch = 'A';
int code = ch; // 自动转换:char → int(输出 Unicode 值 65)
强制类型转换
,可能会造成精度丢失
或溢出
精度丢失示例:
double d = 123.456;
int i = (int) d; // 强制转换:double → int(结果为123,精度丢失)
精度溢出示例:
溢出
是指一个数值超出了该数据类型所能表示的范围,导致结果不正确
甚至反方向回绕
byte b = 127; // byte 的最大值是 127
b = (byte)(b + 1); // 加1后会溢出,结果是 -128
long l = 3000000000L;
int j = (int) l; // 强制转换:long → int(溢出,结果为-1294967296)
byte, short, char 运算 ➜ 自动变成 int
byte a = 10;
byte b = 20;
// byte c = a + b; // 编译错误:结果是 int
int c = a + b; // 正确
//byte、short之间做运算
byte b3 = 12;
short s1 = 10;
//short s2 = b3 + s1; // 编译不通过 需要用int来接收
int i4 = b3 + s1; // 正确
int 与 long 运算 ➜ 提升为 long
int i = 1000;
long l = 2000L;
long result = i + l; // i 自动转为 long
int 与 float 运算 ➜ 提升为 float
int i = 5;
float f = 2.5f;
float res = i + f; // i 转为 float,结果是 7.5
float 与 double 运算 ➜ 提升为 double
float f = 3.5f;
double d = 1.2;
double res = f + d; // f 转为 double,结果是 4.7