ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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敲几行代码试试每种类型,感受一下它们的取值范围和特点。

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

返回列表