乐途乐途
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
主页
  • 计算机基础

    • TCP/IP
    • Linux
    • HTTP
  • 数据库

    • SQL
    • MySQL 5.7
  • 编程语言

    • C
    • C++
    • Java SE
    • Python2
    • Python3
  • 数据格式

    • JSON
    • XML
  • 认证与安全

    • JWT
  • 工具

    • Markdown
  • Git

    • GitFlow
  • Quartz

    • Quartz
  • Java

    • Maven 入门
    • Maven 进阶
    • MyBatis
    • Spring
    • Spring MVC
  • Java

    • Spring Boot
    • Spring Cloud
    • Spring Cloud Alibaba
    • Spring Security
    • Spring AI
    • Spring Batch
    • Kafka
    • Java 设计模式
  • 缓存

    • Redis
  • 搜索引擎

    • Elasticsearch
  • 分布式协调

    • ZooKeeper
联系
阿里云
  • 学习路径
  • 第1章 Java概述与环境搭建

    • Java概述与环境搭建
    • Java语言概述
    • 解释型语言与编译型语言对比
    • JDK安装与配置
    • JDK、JRE、JVM 详解
    • HelloWorld程序详解
    • IDE 介绍
  • 第2章 标识符与基本数据类型

    • 章节导读
    • 变量概述
    • 常量概述
    • 基本类型与包装类
    • 字节型 byte
    • 短整型 short
    • 整型 int
    • 长整型 long
    • 单精度浮点型 float
    • 双精度浮点型 double
    • 字符型 char
    • 布尔型 boolean
    • 类型转换
  • 第3章 运算符与表达式

    • 章节导读
    • 算术运算符
    • 赋值运算符
    • 关系运算符
    • 逻辑运算符
    • 位运算符
    • 条件运算符
    • 运算符优先级
    • 表达式
  • 第4章 流程控制

    • 章节导读
    • 常见的程序运行流程
    • if-else 选择结构
    • switch 多分支选择
    • while 循环
    • do-while 循环
    • for 循环
    • break 与 continue
  • 第5章 数组

    • 章节导读
    • 一维数组
    • 多维数组
    • Arrays 工具类
  • 第6章 类与对象

    • 章节导读
    • 类与对象
    • 方法定义与调用
    • 构造方法
    • 封装
    • 访问修饰符
    • package 与 import
    • static 关键字
    • this 关键字
    • 参数传递 详解
    • 枚举
    • 成员内部类
    • 局部内部类
    • 静态内部类
    • 匿名内部类
  • 第7章 接口与继承

    • 章节导读
    • 继承
    • super 关键字
    • final 关键字
    • 多态
    • 向上转型与向下转型
    • 抽象类
    • 接口
    • 抽象类与接口对比
  • 第8章 注解

    • 章节导读
    • 注解基础
    • 元注解详解
    • 自定义注解
  • 第9章 常用类

    • 章节导读:Java 常用类
    • Object 类:万类之祖
    • 包装类:基本类型的对象化
    • String:不可变的字符串
    • StringBuffer:线程安全的可变字符串
    • StringBuilder:可变的字符串构建器
    • Math:数学运算工具类
    • Random:伪随机数生成器
    • 大数值运算 详解
    • 日期时间API 详解
  • 第10章 异常机制

    • 章节导读
    • 异常体系与分类
    • try-catch-finally
    • try-with-resources
    • throws 与 throw
    • 自定义异常
  • 第11章 泛型

    • 章节导读
    • 泛型基础
    • 通配符与PECS原则
    • 类型擦除
  • 第12章 集合框架

    • 章节导读
    • 集合框架概述
    • ArrayList
    • LinkedList
    • HashMap 详解
    • LinkedHashMap 详解
    • TreeMap 详解
    • HashSet
    • TreeSet 详解
    • TreeSet 与 Comparable
    • Collections 工具类详解
  • 第13章 IO流

    • 章节导读
    • IO流概述
    • 字节流
    • 字符流
    • 缓冲流
    • 转换流 详解
    • 序列化 详解
    • NIO与Files 详解
    • NIO与Files工具类
  • 第14章 多线程与并发

    • 第十六章 多线程与并发 —— 章节导读
    • 线程基础详解
    • synchronized 详解
    • Lock 与显式锁详解
    • volatile 详解
    • wait 与 notify 详解
    • ThreadLocal详解
    • 原子类详解
    • 并发工具类详解
    • 线程池详解
  • 第15章 反射

    • 章节导读
    • 反射概述与 Class 对象
    • Constructor 与对象创建
    • Field与Method详解
    • 反射应用详解
  • 第16章 JDK8新特性

    • 章节导读
    • Lambda 表达式
    • Stream API 基础
    • Stream API 高级详解
    • Optional 详解
    • 新日期时间API详解
  • 第17章 JDK9-11新特性

    • 章节导读
    • 模块化系统 — Project Jigsaw(JDK 9)
    • var 局部变量类型推断(JDK 10)
    • 集合工厂方法与增强(JDK 9 / 10 / 11)
    • 接口增强:private 方法(JDK 9)
    • Stream API 增强(JDK 9)
    • Optional 增强(JDK 9 / 10 / 11)
    • String 新增方法(JDK 11)
    • HTTP Client 与 Files 增强(JDK 11)
    • 直接运行 Java 源文件 — JEP 330(JDK 11)
  • 第18章 JDK12-17新特性

    • 章节导读
    • Switch 表达式(JDK 12 预览 / JDK 14 正式)
    • 文本块 Text Blocks(JDK 13 预览 / JDK 15 正式)
    • Records 记录类(JDK 14 预览 / JDK 16 正式)
    • 密封类 Sealed Classes(JDK 15 预览 / JDK 17 正式)
    • instanceof 模式匹配(JDK 14 预览 / JDK 16 正式)
    • Switch 模式匹配 — Pattern Matching for switch(JDK 17 预览 / JDK 21 正式)
    • Helpful NPE 与 String 增强(JDK 12 / JDK 14 / JDK 15)
    • Stream 增强(JDK 12 / JDK 16)
    • 日期时间增强 — Day Period 支持(JDK 16)
  • 第19章 JDK18-21新特性

    • 章节导读
    • 虚拟线程(JDK 19 预览 / JDK 20 第二预览 / JDK 21 正式)
    • 序列集合(JDK 21 正式)
    • Switch 模式匹配(JDK 17 预览 / JDK 18 第二预览 / JDK 20 第四预览 / JDK 21 正式)
    • Record 模式匹配(JDK 19 预览 / JDK 20 第二预览 / JDK 21 正式)
    • 未命名模式与变量(JDK 21 预览 / JDK 22 正式)
  • 第20章 JDK 22-25 新特性

    • 章节导读
    • 字符串模板(JDK 22 预览 / JDK 23 第二预览 / JDK 24 第三预览)
    • Stream Gatherers(JDK 22 预览 / JDK 24 第二预览)
    • 隐式声明类与实例方法(JDK 23 预览 / JDK 24 第二预览)
    • 原始类型模式匹配(JDK 24 预览)
  • 附录

    • Java 核心知识点
    • Java SE 专业术语
    • Java特性索引(JDK 8 → 25)

短整型 short

本章定位:short是16位有符号整数类型,取值范围-32768~32767。在飞翔科技的旅游系统中,short常用于年龄限制、年份、限高等"刚好不超过三万"的数据。小崔曾好奇为什么很少见人用short,白歌解释:现代JVM对int优化更好,short更多用于JNI交互和特定协议字段。


定义与语法

属性说明
关键字short(短整型)
位数16 bits(2字节)
表示法有符号二进制补码
取值范围-32768 ~ 32767(即 -2¹⁵ ~ 2¹⁵-1)
默认值0
包装类java.lang.Short

基本声明

short minAge = 18;          // 购物年龄限制
short travelYear = 2018;    // 出行年份
short minHeight = 120;      // 最低身高要求120cm
short maxWeight = 150;      // 最大体重150kg
short examScore = 100;      // 考试满分100分
short heartRate = 72;       // 心率72次/分

深度原理:short的16位二进制世界

与 byte 的继承关系

short可以安全接收byte的所有值(widening自动转换),但short到int也是自动转换。这就是Java的类型提升路径。


完整代码示例

示例一:飞翔旅游系统的short应用

/**
 * 飞翔科技 - short 类型演示
 * 场景:飞翔旅游平台的出行信息(年龄、年份、限高都在short范围内)
 */
public class ShortTravelDemo {
    public static void main(String[] args) {
        // 旅游场景数据
        short travelYear = 2018;       // 出行年份
        short minHeight = 120;         // 最低身高120cm
        short maxWeight = 150;         // 最大体重150kg
        short dailyVisitorLimit = 1000; // 日限流(short最大32767,够用)
        
        // 游客信息
        short visitorAge = 25;
        short visitorHeight = 175;
        short visitorWeight = 68;
        
        // 资格校验
        boolean ageOk = visitorAge >= 18;
        boolean heightOk = visitorHeight >= minHeight;
        boolean weightOk = visitorWeight <= maxWeight;
        boolean allOk = ageOk && heightOk && weightOk;
        
        System.out.println("【飞翔旅游 - 景区资格校验】");
        System.out.println("出行年份:" + travelYear + "年");
        System.out.println("游客年龄:" + visitorAge + "岁 " + (ageOk ? "✓" : "✗需满18岁"));
        System.out.println("游客身高:" + visitorHeight + "cm " + (heightOk ? "✓" : "✗最低" + minHeight + "cm"));
        System.out.println("游客体重:" + visitorWeight + "kg " + (weightOk ? "✓" : "✗最大" + maxWeight + "kg"));
        System.out.println("日限流:" + dailyVisitorLimit + "人");
        System.out.println("综合结果:" + (allOk ? "允许参与" : "不满足条件"));
        
        System.out.println("\n【类型信息】");
        System.out.println("short 最小值:" + Short.MIN_VALUE);
        System.out.println("short 最大值:" + Short.MAX_VALUE);
        System.out.println("short 位数:" + Short.SIZE + " bit");
    }
}
运行输出:
【飞翔旅游 - 景区资格校验】
出行年份:2018年
游客年龄:25岁 ✓
游客身高:175cm ✓
游客体重:68kg ✓
日限流:1000人
综合结果:允许参与

【类型信息】
short 最小值:-32768
short 最大值:32767
short 位数:16 bit

示例二:short运算中的自动提升

/**
 * 飞翔科技 - short 运算演示
 * 场景:小崔计算运动心率范围,发现short+short结果是int
 */
public class ShortOperationDemo {
    public static void main(String[] args) {
        short baseHeartRate = 72;     // 静息心率
        short exerciseRate = 135;     // 运动心率
        short maxSafeRate = 180;      // 最大安全心率
        
        // short 运算自动提升为 int
        // short sum = baseHeartRate + exerciseRate;  // 编译错误!
        int totalRate = baseHeartRate + exerciseRate;  // int 接收
        
        // 需要 short 结果时强制转换
        short avgRate = (short) ((baseHeartRate + exerciseRate) / 2);
        
        // short 的比较运算也自动提升
        boolean isSafe = exerciseRate < maxSafeRate;
        
        System.out.println("【飞翔运动 - 心率分析】");
        System.out.println("静息心率:" + baseHeartRate + " 次/分");
        System.out.println("运动心率:" + exerciseRate + " 次/分");
        System.out.println("合计心率:" + totalRate + " 次/分(int类型)");
        System.out.println("平均心率:" + avgRate + " 次/分(强转回short)");
        System.out.println("安全范围内:" + isSafe);
        System.out.println("最大安全心率:" + maxSafeRate + " 次/分");
    }
}
运行输出:
【飞翔运动 - 心率分析】
静息心率:72 次/分
运动心率:135 次/分
合计心率:207 次/分(int类型)
平均心率:103 次/分(强转回short)
安全范围内:true
最大安全心率:180 次/分

易错场景

反例一:short 字面量越界

// ❌ 错误:32768 超出 short 最大值 32767
short value = 32768;  // 编译错误:incompatible types: possible lossy conversion from int to short

// ✅ 正确:在范围内
short value = 32767;  // 合法

反例二:short 运算忘记强转

// ❌ 错误:short 运算结果是 int,不能直接赋给 short
short a = 100;
short b = 200;
short sum = a + b;  // 编译错误

// ✅ 正确:强转或改用 int
short sum = (short) (a + b);   // 方式一:强转
int sumInt = a + b;            // 方式二:直接用int(推荐)

反例三:short 溢出(溢出到负数)

// ❌ 危险:short 最大值 32767 + 1 = -32768(溢出回绕)
short max = 32767;
short overflow = (short) (max + 1);
System.out.println(overflow);  // 输出 -32768(不是期待的 32768)

// ✅ 正确:用更大类型 int 存储
int safeValue = max + 1;  // 32768

适用场景与为何不常用

场景示例原因
TCP/UDP端口号short port = 8080;端口号0~65535,但Java的short有符号
年龄/年份short age = 25;范围足够
JNI本地方法交互short nativeValue;与C的short对应
大数组节省内存short[] arr = new short[10000];相比int数组节省50%内存
文件格式/协议字段读取固定16位字段二进制文件解析

白歌点评:"现代JVM(特别是64位JVM)对32位int的操作做了极致优化,而short需要额外的符号扩展指令,反而可能更慢。除了和C/C++交互、解析二进制协议或节省大数组内存,优先用int。"


面试考点

Q1:short的取值范围为什么是-32768到32767?

short是16位有符号二进制补码。16位共有2¹⁶=65536个值。补码编码中,正数+零占32768个(0~32767),负数占32768个(-1~-32768)。与byte同理,最高位是符号位,10000000 00000000被约定为-32768。

Q2:short s1 = 1; s1 = s1 + 1; 有什么错?short s1 = 1; s1 += 1; 呢?

s1 = s1 + 1编译错误,因为s1 + 1中s1先提升为int,结果也是int,不能直接赋给short。s1 += 1编译通过,因为复合赋值运算符(+=)内置了隐式强制类型转换,等价于s1 = (short)(s1 + 1)。

Q3:short在实际开发中为什么用得不多?

①现代64位JVM对int操作有最优的硬件指令支持,short需要额外的符号扩展;②short范围较小(±3万),容易溢出;③默认整数字面量是int,使用short需要频繁强转,代码不简洁;④内存节省在大多数应用场景中微不足道(除非百万级数组)。因此Java社区约定"整数默认用int"。

上一页
字节型 byte
下一页
整型 int