long是java中64位有符号整型基本数据类型,占用8字节,取值范围为-2⁶³至2⁶³-1,声明需用l后缀,未初始化成员变量默认0l,运算溢出不报错。

Java 中的 long 是一种 64 位有符号整型基本数据类型,不是类,也不属于引用类型——它不依赖对象实例,直接在栈或方法区中分配固定大小的内存空间。
long 类型的定义与声明方式
使用 long 关键字声明变量,赋值时需注意字面量后缀:
- 必须用 L 或 l(推荐大写 L,避免与数字 1 混淆)标识 long 字面量,否则编译器默认按 int 处理;
- 未初始化的 long 成员变量默认值为 0L;局部变量则必须显式初始化;
- 示例:long id = 123456789012345L;、long timestamp = System.currentTimeMillis();
long 占用 8 字节,取值范围固定
long 在 JVM 中始终占用 8 个字节(64 位),采用补码表示有符号整数:
- 最小值:Long.MIN_VALUE = -9,223,372,036,854,775,808(即 -2⁶³);
- 最大值:Long.MAX_VALUE = 9,223,372,036,854,775,807(即 2⁶³ - 1);
- 超出此范围的整数字面量即使加了 L 后缀,也会编译失败;
- 该范围足以覆盖 Unix 时间戳(到约公元 292278994 年)、大型数据库主键、高并发计数器等常见场景。
内存存储与运算特点
long 的存储和运算是 JVM 直接支持的原生操作,无需装箱/拆箱(除非涉及 Long 包装类):
- 在栈中作为局部变量时,分配连续 8 字节空间,对齐方式由 JVM 实现决定(通常按 8 字节对齐);
- 参与算术运算(+、-、*、/、%)时,结果仍为 long 类型,溢出不报错,仅按补码规则截断;
- 与 int 混合运算时,int 自动提升为 long,整个表达式按 long 计算;
- 不能直接赋值给 float/double(需显式转型),因可能损失精度(尽管数值可表示,但浮点类型无法精确表达所有 long 值)。
常见误用与规避建议
实际开发中容易忽略的细节:
- 写 long num = 10000000000; 会报错:该字面量超 int 范围且无 L 后缀;应写成 10000000000L;
- 用 == 比较两个 Long 对象可能出错(自动装箱后比较的是引用),应优先用 equals() 或直接用基本类型 long;
- 处理时间戳、文件大小、ID 等大整数场景时,优先选 long 而非 int,避免隐式溢出;
- 若需无符号语义(如解析网络协议中的 uint64),Java 8+ 提供 Long.toUnsignedString()、Long.compareUnsigned() 等辅助方法,但底层仍是 signed 存储。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











