Java基本数据类型直接映射内存,设计逻辑源于JVM底层安全与对齐需求;整型运算自动提升至int,浮点默认double且存在精度误差,char本质为无符号16位整数,类型转换遵循安全边界,包装类与基本类型分工明确。

整数类型:大小决定行为,而非直觉
四种整型(byte、short、int、long)按字节递增,但使用逻辑不线性:
-
int 是默认主力:循环计数、数组索引、方法参数几乎都用它;声明
int i = 100;不需后缀,简洁且安全 -
long 必须带 L:写
long x = 10000000000;编译失败,必须写10000000000L—— 因为字面量默认是 int,超范围就报错 -
byte/short 参与运算自动升级:哪怕只做
byte a = 1; byte b = 2; int c = a + b;,这里a + b的结果已是int,不能直接赋给byte变量(会编译错误) -
手机号别用 int 或 long 存:11 位数字最大是 99,999,999,999,已超出
int(约 21 亿),虽long能装,但含前导零(如 01234567890)会丢失,应统一用String
浮点与字符:精度和编码不可混谈
float 和 double 不是“小数版 int”,它们用 IEEE 754 表示,天生存在精度误差;char 也不是“小写的 String”,它是无符号 16 位整数,本质可参与算术运算:
-
浮点字面量默认是 double:写
float f = 3.14;报错,必须写3.14f或强制转(float)3.14 -
不要用 == 比较 float/double:
0.1 + 0.2 != 0.3是常态,业务中涉及金额务必用BigDecimal,或用差值小于1e-6判断相等 -
char 可当整数用:例如
char c = 'A'; int code = c + 1;得到 66(即 'B' 的 Unicode 码),System.out.println((char)97);输出 'a' -
char 范围是 0~65535,不是 ASCII 的 0~127;支持中文如
char ch = '中';合法且常用
类型转换:自动提升有边界,强制转换要担责
Java 只允许“安全方向”的自动转换(从小范围→大范围),反向必须显式强制,且可能丢数据:
- 自动转换链:byte → short → int → long → float → double;char → int(因 char 无符号,0~65535,升为 int 不会溢出)
-
char 和 byte/short 互转不自动:
char c = (char)65;可以,但byte b = 'A';不行——必须byte b = (byte)'A'; -
强制转换不检查数值合理性:比如
int i = 300; byte b = (byte)i;,结果是 44(300 对 256 取模),静默截断,无异常 - boolean 完全隔离:不能转成 0/1,也不能被任何类型转换——这是语言层硬性限制,不是实现细节
基本类型 vs 包装类:栈与堆的分工
基本类型存值(栈),包装类存引用(堆)。二者不是“同义词”,而是解决不同问题的工具:
立即学习“Java免费学习笔记(深入)”;
- 泛型和集合只能用包装类:List<Integer> 合法,List<int> 编译失败
-
自动装箱/拆箱有坑:Integer a = 127; Integer b = 127;
a == b为 true(缓存池内复用对象);但 a = 128; b = 128; 时a == b为 false(新建对象) -
null 风险真实存在:Integer i = null; int j = i; 运行时报
NullPointerException,拆箱时才会暴露 -
性能敏感场景优先用基本类型:高频循环中用
int而非Integer,避免频繁创建/销毁对象


















