方法定义
public short shortValue()
- 功能:将
Integer
对象的值转换为short
基本类型 - 返回值:
short
类型(16位有符号整数,范围:-32,768 到 32,767) - 继承自:
Number
类(所有数字包装类的基类)
功能说明
- 类型转换:将
int
值窄化为short
(截取低16位数据) - 数值截断:
- 若原值超出
short
范围(-32,768 ~ 32,767),高位数据会被丢弃 - 不会抛出异常,但可能导致数据失真
- 若原值超出
- 自动拆箱:隐式调用
intValue()
获取整数值后再转换
示例代码
Integer num1 = 100;
short s1 = num1.shortValue(); // 正常转换:s1 = 100
Integer num2 = 50000; // 超出short范围
short s2 = num2.shortValue(); // 截断:s2 = -15536(二进制截断结果)
Integer num3 = -40000; // 超出负向范围
short s3 = num3.shortValue(); // 截断:s3 = 25536
// 与直接强制转换等效
short s4 = (short) num1.intValue(); // 显式写法
常见错误与注意事项
静默数据截断(最危险!)
Integer bigNum = 32768; // 比short最大值大1 short s = bigNum.shortValue(); // 结果=-32768(无警告!)
- 解决方案:转换前检查范围
if (num >= Short.MIN_VALUE && num <= Short.MAX_VALUE) { short safeValue = num.shortValue(); }
- 解决方案:转换前检查范围
空指针异常
Integer num = null; short s = num.shortValue(); // 抛出 NullPointerException
浮点数截断问题
Integer num = 3.14.intValue(); // 先取整为3 short s = num.shortValue(); // 结果为3(非3.14)
最佳实践
范围检查:始终验证值是否在
short
范围内public static Optional<Short> safeShortValue(Integer num) { if (num == null) return Optional.empty(); int value = num; return (value >= Short.MIN_VALUE && value <= Short.MAX_VALUE) ? Optional.of((short) value) : Optional.empty(); }
优先使用基础类型:避免不必要的对象创建
// 优于 new Integer(100).shortValue() short s = 100;
明确注释:在可能截断的地方添加警告注释
// WARNING: 可能丢失精度 - 确保值 < 32,767 short id = config.getId().shortValue();
性能说明
- 开销极低:仅包含类型转换操作(JIT会优化)
- 对比方案:
| 方法 | 性能 | 安全性 |
|------------------------|---------|-----------|
|
shortValue()
| ⚡️ 极高 | ❌ 低 | | 手动范围检查 + 转换 | ⚡️ 高 | ✅ 高 | |Math.toIntExact()
| ⚡️ 中 | ✅ 中(仅int范围)|
总结
关键点 | 说明 |
---|---|
核心用途 | Integer → short 类型转换 |
最大风险 | 静默数据截断(无警告/异常) |
必做检查 | 转换前用 Short.MIN_VALUE/MAX_VALUE 验证范围 |
空值处理 | 需显式检查 null 避免 NPE |
替代方案 | 基础类型运算 > 手动转换 > 包装类方法 |