Java的4类8种基本数据类型
Java的8种基本数据类型详解写代码最郁闷的事儿是什么代码写完一点运行控制台输出的全是看不懂的英文。去查报错信息全是类型不匹配、“精度丢失”、“数据溢出”……或者代码可以成功运行但输出的计算结果却不正确。一开始还以为是IDE的问题后来才明白——Java是强类型语言数据类型选错了轻则结果不对重则程序直接崩溃。什么是基本数据类型在Java编程中你创建的每一个变量都必须先声明它属于哪一类数据。这就像在储物柜里放东西你必须先说清楚要放的是一本小册子还是一个行李箱系统才好分配相应大小的格子给你。Java中的数据分为两种基本数据类型直接存储数值本身效率高。引用数据类型存储的是内存地址像是存的门牌号。基本数据类型细分分为4类共8种类型包含存储内容整数类型byte、short、int、long数学中的整数浮点类型float、double数学中的小数字符类型char单个字符布尔类型booleantrue或false整数类型整数类型就是数学中的整株共有4种byte、short、int、long。byte位byteage25;bytestatusCode0;特点占用1字节8位取值范围-128 ~ 127默认值0什么时候用它文件IO操作的时候最常用。比如InputStream.read()返回的就是byte类型表示一个字节的数据因为文件在底层本质上就是字节序列。还有网络传输字节流、大数组优化内存都用得。// 读取文件字节InputStreaminnewFileInputStream(data.bin);byteb(byte)in.read();// 每次读一个字节short短整型shorttemperature-10;shortstudentCount305;特点占用2字节16位取值范围-32768 ~ 32767默认值0short在日常开发中极少使用。只有在内存极度敏感的场景比如嵌入式设备、处理特定格式的二进制数据才可能用到。现在JVM的优化已经很好服务器内存的成本也相对便宜了int反而更常用。int整型默认intcount100;intmaxUsers1000000;intarraySize1000;特点占用4字节32位取值范围-2147483648 ~ 2147483647约±21亿默认值0int是Java的默认整数类型。你写100这样的字面量编译器默认就当int处理。日常开发中绝大多数整数场景都是使用int例如计数、数组索引、商品数量等只要不超过21亿闭眼用int。隐藏大坑整数溢出intmax2147483647;intoverflowmax1;// 结果-2147483648注意这个BUG比较隐蔽编译不报错运行也不报错但结果完全不对。如果是金额计算时溢出了那后果真是不堪设想。long长整型longtimestampSystem.currentTimeMillis();// 时间戳longpopulation7800000000L;// 全球人口必须加LlongfileSize1024L*1024L*1024L;特点占用8字节64位取值范围约±922亿亿默认值0Llong一定要加L后缀否则大数字会被当成int编译直接报错。longbig10000000000L;// 正确加了Llongbig210000000000;// 错误超出int范围编译不过long的常见应用时间戳、大文件的大小、ID生成等。整数类型选型指南类型字节取值范围选型建议byte1-128~127文件流、字节数组short2-3万~3万内存敏感场景int4±21亿日常首选long8±9万亿亿时间戳、大数值记住口诀日常用int超大整数用long。浮点类型浮点数就是数学中的小数包括float和double。float单精度floatpi3.14159f;// 必须加Ffloattemperature36.6f;特点占用4字节32位精度约6-7位有效数字默认值0.0fdouble双精度默认doubleprice99.99;// 默认就是double不用加后缀doubletax0.08;doubleresult1.0/3.0;// 0.3333333333333333特点占用8字节64位精度约15-16位有效数字默认值0.0Java里小数默认是double。所以3.14是double3.14f才是float。⚠️ 精度问题浮点数的精度是有限的不能精确表示所有小数。这是IEEE 754标准决定的不是Java的问题。看这个经典案例doublea0.1;doubleb0.2;doublesumab;System.out.println(sum);// 输出 0.30000000000000004不是0.3金额计算要是这么干差个几毛钱甚至几块钱用户不得把你骂死正确做法金额计算用BigDecimalimportjava.math.BigDecimal;BigDecimalpricenewBigDecimal(99.99);BigDecimaltaxnewBigDecimal(0.08);BigDecimaltotalprice.multiply(tax);// 8.0不会有精度问题float/double对比类型字节有效位数选型建议float46-7位图形处理、科学计算double815-16位日常首选Java默认口诀日常用double金额用BigDecimalfloat很少用。字符类型char存单个字符chargradeA;charzh中;// 中文OKcharemoji;// emoji也OK特点占用2字节16位范围0 ~ 65535Unicode字符默认值’\u0000’空字符Java的char用Unicode编码能表示全球几乎所有语言的字符。中文、日文、emoji表情统统拿下。char的几种写法// 1. 直接写字符charc1A;// 2. 用Unicode转义charc2\u0041;// 等价于A0041是A的Unicode编码// 3. 用整数Unicode码点charc365;// 也是A// 4. 参与运算System.out.println(A1);// 输出66对应B注意部分emoji占4个字节超出了char的表示范围需要用两个char代理对来表示。布尔类型boolean只有真假booleanisLoggedIntrue;booleanhasPermissionfalse;特点取值只有true(真)和false假默认值false特别注意不能用0或1代替true/false这跟C语言不一样// 错误写法编译不过booleanflag1;// 报错// 正确写法booleanflagtrue;不能跟整数相互转换// 这个也会报错booleanflagtrue;intnumflag1;// 报错二元运算符的操作数类型错误JVM没有明确规定boolean占几个字节理论上1位就够但实际通常用1字节存储内存对齐。与君共勉数据类型看着简单就只有几个关键字里面的门道可真不少。整数溢出、浮点精度这些坑我当年都踩过也见过很多这类BUG。特别注意*金额计算千万不要用float/double这条是铁律记住就行。整数运算时注意溢出特别是累加、乘法场景。long类型必须加L后缀不然编译无法通过。能用int就别用short现代JVM优化好别过早优化学编程没有捷径动手实践才是最好的学习方式。看完这篇文章打开IDE敲几行代码试试每种类型感受一下它们的取值范围和特点。有问题评论区见看到必回觉得有用的话点个赞支持一下