当前位置: 首页 > news >正文

Java的4类8种基本数据类型

Java的8种基本数据类型详解

写代码最郁闷的事儿是什么?

  • 代码写完一点运行,控制台输出的全是看不懂的英文。去查报错信息,全是"类型不匹配"、“精度丢失”、“数据溢出”……
  • 或者代码可以成功运行,但输出的计算结果却不正确。

一开始还以为是IDE的问题,后来才明白——Java是强类型语言,数据类型选错了,轻则结果不对,重则程序直接崩溃

什么是基本数据类型

在Java编程中,你创建的每一个变量,都必须先声明它属于哪一类数据。这就像在储物柜里放东西:你必须先说清楚要放的是一本小册子还是一个行李箱,系统才好分配相应大小的格子给你。
Java中的数据分为两种:

  • 基本数据类型:直接存储数值本身,效率高。
  • 引用数据类型:存储的是内存地址,像是存的门牌号。

基本数据类型细分分为4类,共8种:

类型包含存储内容
整数类型byteshortintlong数学中的整数
浮点类型floatdouble数学中的小数
字符类型char单个字符
布尔类型booleantruefalse

整数类型

整数类型就是数学中的整株,共有4种:byteshortintlong

byte:位

byteage=25;bytestatusCode=0;

特点

  • 占用:1字节(8位)
  • 取值范围:-128 ~ 127
  • 默认值:0

什么时候用它?

文件IO操作的时候最常用。比如InputStream.read()返回的就是byte类型,表示一个字节的数据(因为文件在底层本质上就是字节序列)。还有网络传输字节流、大数组优化内存,都用得。

// 读取文件字节InputStreamin=newFileInputStream("data.bin");byteb=(byte)in.read();// 每次读一个字节

short:短整型

shorttemperature=-10;shortstudentCount=305;

特点

  • 占用:2字节(16位)
  • 取值范围:-32768 ~ 32767
  • 默认值:0

short在日常开发中极少使用。只有在内存极度敏感的场景(比如:嵌入式设备、处理特定格式的二进制数据)才可能用到。现在JVM的优化已经很好,服务器内存的成本也相对便宜了,int反而更常用。

int:整型(默认)

intcount=100;intmaxUsers=1000000;intarraySize=1000;

特点

  • 占用:4字节(32位)
  • 取值范围:-2147483648 ~ 2147483647(约±21亿)
  • 默认值:0

int是Java的默认整数类型。你写100这样的字面量,编译器默认就当int`处理。

日常开发中,绝大多数整数场景都是使用int,例如:计数、数组索引、商品数量等,只要不超过21亿,闭眼用int

隐藏大坑:整数溢出

intmax=2147483647;intoverflow=max+1;// 结果:-2147483648

注意:这个BUG比较隐蔽,编译不报错,运行也不报错,但结果完全不对。如果是金额计算时溢出了,那后果真是不堪设想。

long:长整型

longtimestamp=System.currentTimeMillis();// 时间戳longpopulation=7800000000L;// 全球人口,必须加LlongfileSize=1024L*1024L*1024L;

特点

  • 占用:8字节(64位)
  • 取值范围:约±922亿亿
  • 默认值:0L

long一定要加L后缀,否则大数字会被当成int,编译直接报错。

longbig=10000000000L;// 正确,加了Llongbig2=10000000000;// 错误!超出int范围,编译不过

long的常见应用:时间戳、大文件的大小、ID生成等。

整数类型选型指南

类型字节取值范围选型建议
byte1-128~127文件流、字节数组
short2-3万~3万内存敏感场景
int4±21亿日常首选
long8±9万亿亿时间戳、大数值

记住口诀:日常用int,超大整数用long

浮点类型

浮点数就是数学中的小数,包括:floatdouble

float:单精度

floatpi=3.14159f;// 必须加Ffloattemperature=36.6f;

特点

  • 占用:4字节(32位)
  • 精度:约6-7位有效数字
  • 默认值:0.0f

double:双精度(默认)

doubleprice=99.99;// 默认就是double,不用加后缀doubletax=0.08;doubleresult=1.0/3.0;// 0.3333333333333333

特点

  • 占用:8字节(64位)
  • 精度:约15-16位有效数字
  • 默认值:0.0

Java里小数默认是double。所以3.14double3.14f才是float

⚠️ 精度问题

浮点数的精度是有限的,不能精确表示所有小数。这是IEEE 754标准决定的,不是Java的问题。

看这个经典案例

doublea=0.1;doubleb=0.2;doublesum=a+b;System.out.println(sum);// 输出 0.30000000000000004,不是0.3!

金额计算要是这么干,差个几毛钱甚至几块钱,用户不得把你骂死?

正确做法:金额计算用BigDecimal

importjava.math.BigDecimal;BigDecimalprice=newBigDecimal("99.99");BigDecimaltax=newBigDecimal("0.08");BigDecimaltotal=price.multiply(tax);// 8.0,不会有精度问题

float/double对比

类型字节有效位数选型建议
float46-7位图形处理、科学计算
double815-16位日常首选,Java默认

口诀:日常用double,金额用BigDecimalfloat很少用。

字符类型

char:存单个字符

chargrade='A';charzh='中';// 中文OKcharemoji='😀';// emoji也OK

特点

  • 占用:2字节(16位)
  • 范围:0 ~ 65535(Unicode字符)
  • 默认值:’\u0000’(空字符)

Java的charUnicode编码,能表示全球几乎所有语言的字符。中文、日文、emoji表情,统统拿下。

char的几种写法

// 1. 直接写字符charc1='A';// 2. 用Unicode转义charc2='\u0041';// 等价于'A',0041是A的Unicode编码// 3. 用整数(Unicode码点)charc3=65;// 也是'A'// 4. 参与运算System.out.println('A'+1);// 输出66,对应'B'

注意:部分emoji占4个字节,超出了char的表示范围,需要用两个char(代理对)来表示。

布尔类型

boolean:只有真假

booleanisLoggedIn=true;booleanhasPermission=false;

特点

  • 取值:只有true(真)和false(假)
  • 默认值:false

特别注意

  1. 不能用01代替true/false(这跟C语言不一样!)
// 错误写法,编译不过booleanflag=1;// 报错!// 正确写法booleanflag=true;
  1. 不能跟整数相互转换
// 这个也会报错booleanflag=true;intnum=flag+1;// 报错:二元运算符'+'的操作数类型错误
  1. JVM没有明确规定boolean占几个字节,理论上1位就够,但实际通常用1字节存储(内存对齐)。

与君共勉

数据类型看着简单,就只有几个关键字,里面的门道可真不少。整数溢出、浮点精度,这些坑我当年都踩过,也见过很多这类BUG。

特别注意*:

  1. 金额计算千万不要用float/double:这条是铁律,记住就行。
  2. 整数运算时注意溢出:特别是累加、乘法场景。
  3. long类型必须加L后缀:不然编译无法通过。
  4. 能用int就别用short:现代JVM优化好,别过早优化

学编程没有捷径,动手实践才是最好的学习方式。看完这篇文章,打开IDE敲几行代码试试每种类型,感受一下它们的取值范围和特点。

有问题评论区见,看到必回!觉得有用的话,点个赞支持一下~

http://www.jsqmd.com/news/996881/

相关文章:

  • OpCore-Simplify:重新定义黑苹果配置的技术哲学与实践
  • Rasa Action Server 异步调用实战:从原理到高可用落地
  • 2026年成都盘扣式钢管架租赁市场观察:本地服务商综合能力解析与案例参考 - 优质品牌商家
  • 如何用moderncv打造专业简历:LaTeX排版终极指南
  • Facebook Prophet季节性建模:从业务语义到可解释周期分解
  • 计算机毕业设计之驿途系统
  • Plotly Express实战指南:三行代码构建交互式数据看板
  • FlexCAN(FD) MB地址计算函数详解:从寄存器位域到C语言指针的跨越
  • 从“直通”到“炸管”:手把手分析一个MOS管驱动电路的失败案例
  • Rust加速Python数据科学:Polars/TikToken/River/HyperJSON实战指南
  • hot100 33.搜索旋转排序数组
  • AI推广品牌哪家好,按年收费且性价比高的有哪些 - mypinpai
  • 别再傻傻分不清了!C语言中算术移位、逻辑移位和循环移位的区别与实战避坑指南
  • 创维E900V22D刷Armbian系统终极指南:从电视盒子到高性能服务器的完美蜕变
  • 别再让需求文档睡大觉了!用Aspice SWE.1的8个实践,盘活你的软件需求分析
  • 计算机毕业设计之艺术作品展示平台及版权保护机制
  • TVA在智慧城市治理中的10大应用场景
  • Python图像预处理实战:OpenCV工业级噪声滤波与光照归一化
  • ThinkPHP微盘交易系统源码+宝塔一键部署全套文件
  • 告别混乱指示灯:手把手教你用NPEM(PCIe 4.0+)统一管理服务器SSD状态灯
  • Java写的局域网双人五子棋,带服务端和客户端完整可运行代码
  • 别再只盯着摩尔定律了!聊聊AMD、台积电都在用的混合键合(Hybrid Bonding)到底强在哪
  • Spring Boot + PgVector 实现企业级 RAG 向量检索实战
  • 鸿蒙 App 模块化拆分:架构解析 + 实战案例
  • 企业级火锅店管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 秒杀场景下,为什么我放弃了线程池而选择了阻塞队列?聊聊异步处理的选型思考
  • CTAP协议实战:用Python模拟一个FIDO2认证器,深入理解WebAuthn背后的握手过程
  • 700万用户真实AI行为解密:从工具使用到认知协作的四阶跃迁
  • LangGraph实战:构建可调试、容错的智能Agent系统
  • Yelp数据EDA实战:业务问题驱动的四层分析漏斗