long是java中64位有符号整数类型,固定占8字节,取值范围−2⁶³至2⁶³−1;声明需用l后缀或强制转换,内存布局严格按8字节对齐,溢出不自动检测。

Java中long是64位有符号整数类型,固定占用8字节(64位)内存,取值范围为−2⁶³ 到 2⁶³−1(即−9,223,372,036,854,775,808 到 9,223,372,036,854,775,807)。声明时需注意语法规范和字面量后缀,否则可能触发编译错误或隐式类型转换。
正确声明long变量的三种常见方式
必须显式指定字面量为long类型,否则整数字面量默认为int。未加后缀的超范围数值会直接报错。
-
带L后缀的十进制字面量:如
long count = 1234567890123L;(推荐用大写L,避免与数字1混淆) -
十六进制或二进制字面量加L:如
long mask = 0xFFL;或long flag = 0b1010L; -
从其他数值类型强制转换:如
long value = (long) Integer.MAX_VALUE;(注意精度丢失风险)
理解8字节内存占用的实际含义
每个long变量在JVM堆或栈中严格分配8个连续字节。这与平台无关(JVM规范保证),但影响内存布局和对象对齐:
- 在对象中,多个
long字段可能因JVM字段重排序或对齐填充而占用额外空间 - 数组
long[]中,每个元素严格占8字节,索引i对应的内存地址为base + i × 8 - 使用
Unsafe或VarHandle可验证其偏移量,例如Unsafe.arrayBaseOffset(long[].class)返回起始偏移,步长恒为8
避免常见误区
初学者容易忽略类型匹配和溢出边界,导致运行时异常或静默截断:
- 不写L后缀且数值超过
int范围(>2147483647)会编译失败:long x = 3000000000;❌ - 用小写l易被误读:
long id = 123l;看起来像1231 —— 始终用123L✅ -
long运算不会自动提升为更大类型,溢出仍发生(Java不检查整数溢出),需手动用Math.addExact()等方法检测
验证内存占用的小技巧
可通过java.lang.instrument或第三方库(如JOL)查看对象内存布局,例如:
System.out.println(VM.current().details());System.out.println(ClassLayout.parseClass(long.class).toPrintable());
输出会明确显示long类型实例大小为8字节,无实例字段的对象头之外,纯数据区就是8字节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











