short是16位有符号整数,取值范围-32768~32767;字面量默认为int,超范围需显式强转;运算时自动提升为int,赋值前须手动强转;转换分拓宽(自动)和窄化(强制)两类。

Java 中 short 是 16 位有符号整数,取值范围固定为 -32768 到 32767。它不是日常开发的主力类型,但用对了能提升语义清晰度或适配特定场景。关键在于理解它的边界、转换规则和常见陷阱。
声明与初始化要注意字面量默认是 int
Java 编译器把没加后缀的整数字面量(如 100、30000)一律当作 int 处理。所以:
-
short s1 = 100;合法——100 在 short 范围内,编译器自动窄化 -
short s2 = 33000;编译失败——33000 超出范围,需显式强转:short s2 = (short)33000; -
short s3 = (short)0xFFFF;可行——十六进制字面量同理,高位截断后得 -1
运算中会自动提升为 int,赋值必须手动强转
所有涉及 short 的算术运算(+、-、*、/、% 等),操作数都会先被提升为 int,结果也是 int。这意味着不能直接把表达式结果赋给 short 变量:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
-
short a = 5, b = 8; short c = a + b;→ 编译报错:类型不匹配 - 正确写法:
short c = (short)(a + b); - 方法调用也一样:
void process(short x) { },传process((short)(a + b))才合法
与其他类型的转换规则很明确
转换分两类:拓宽(自动)和窄化(强制)。
-
拓宽转换(隐式):往更大范围类型转,安全无损
→short s = 100; int i = s; long l = s; float f = s; double d = s; -
窄化转换(显式):往更小范围类型转,可能丢精度或溢出
→short s = 100; byte b = (byte)s; char c = (char)s;
注意:转byte时若s > 127或s ,结果会因截断而改变 -
字符串互转:
→Short.parseShort("200")返回short值
→Short.toString(s)或String.valueOf(s)转字符串
→Short.valueOf("200")返回缓存的Short对象(-128~127 范围内)
适用场景要讲实际,别硬套“省内存”
short 不该是为了“看起来省内存”而用,现代 JVM 对基本类型内存布局优化成熟,单个变量省下的 2 字节几乎无意义。真正值得考虑的情况包括:
- 处理大量同构小整数数据,比如传感器阵列(温度、湿度等稳定在 -50~100 区间),数组维度达数十万以上
- 对接二进制协议、文件格式或硬件接口,字段明确定义为 2 字节(如某些音频采样、图像灰度值、网络包头字段)
- 泛型不可用基本类型,但业务逻辑强依赖数值范围约束时,可用
Short包装类配合校验逻辑(注意装箱开销)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










