Java基本数据类型

数据类型

  • Java是一种强类型语言,这意味着必须为每一个变量声明一种类型。
  • 8种基本类型:4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种表示真值的boolean类型
  • Java有一个能表示任意精度的算数包,通常称为“大数值”(big number)。但它并不是一种新的Java类型,而是一个Java对象。
  • 除了基本数据类型,其他都是引用数据类型
  • 引用数据类型默认值都是null

八大基本类型:

整型:

  • 用于表示没有小数部分的数值,它允许是负数。
  • byte和short主要用于特定场合。例如,底层的文件处理或者需要控制占用存储空间量的大数组。
  • 在Java中,整型的范围与运行Java代码的机器无关。这就解决了 软件从一个平台移植到另一个平台带来的很多问题。与此相反,C/C++需要针对不同的处理器选择最为高效的整型,这就可能造成一个在32位处理器上运行很好的C程序在16位系统上运行却发生整数溢出。
  • 由于Java程序必须保证在所有机器上都能得到相同的运行结果,所以各种数据类型的取值范围必须固定。
  • Java没有任何无符号(unsigned)形式的int、long、short或byte类型

byte:

  • 1字节,8位
  • 取值范围:[-2^7, 2^7-1]=[-128, 127]
  • 默认值0

short:

  • 2字节,16位
  • 取值范围:[-2^15, 2^15-1]=[-32768, 32767]
  • 默认值0

int:

  • 4字节,32位
  • 取值范围:[-2^31, 2^31-1]
  • 默认值0

long:

  • 8字节,64位
  • 取值范围:[-2^63, 2^63-1]
  • 默认值0L
  • 有一个后缀L或者l

浮点型:

  • 用于表示有小数部分的数值
  • 在Java中有2种浮点类型
  • 可以使用十六进制表示浮点数值。
0.125 = 2^-3// 可以表示成0x1.0p-3
// 十六进制中,p表示指数,而不是e
// 尾部采用十六进制,指数采用十进制。指数的基数是2,而不是10
  • 表示溢出和出错情况的三个特殊浮点数值:
    1.正无穷大
    2.负无穷大
    3.NaN(不是一个数字)
// 例如,一个正整数除以0的结果为正无穷大
// 计算0/0或者负数的平方根结果为NaN
  • float和double类型不能表示精确的值,如货币。
  • 因为float和double超过精度表示范围之后会发生精度缺失的情况。这是因为二进制存储十进制浮点数时,先将整数部分转换成二进制(整数部分除2取模,直到被除数为0),然后将小数部分转成二进制(小数部分2取整数部分,剩余小数部分继续2取整数部分,直到积为1),如果计算过程循环,则说明*2永远无法消灭小数部分。所以二进制只能精确表示2的-n次方的整数倍小数。
System.out.println(2.0-1.1) // 0.8999999999999
// 不是0.9的原因是因为浮点数值采用二进制表示
// 而在二进制中无法精确表示分数1/10
  • 所以货币运算/金融计算/不允许有任何舍入误差的数值计算中一般使用BigDecimal

float

  • 4字节,32位
  • 有效位数6~7位
  • 默认值0.0f
  • 后缀F或 f,没有后缀的浮点数值默认为double类型
  • 单精度,很少情况下适用float,例如,需要单精度数据的库或者需要存储大量数据

double

  • 8字节,64位
  • 有效位数15位
  • 默认值0.0d
  • 双精度(数值精度是float的两倍),绝大部分程序都采用double

boolean

  • 只有两个取值:true 和 false;默认是false
  • 整型值和布尔值不能相互转换
  • C++中,数值/指针可以代替boolean值。值0相当于false,非0值相当于true。但是Java中不可以这样。

char

  • 原本用于表示单个字符,现在有些Unicode字符也可以用一个char值描述,另一些Unicode字符需要2个char值
  • char类型的值可以表示为十六进制值
  • 单一的16位Unicode字符
  • 范围:[\u0000, \uffff]=[0, 65535]
  • 可以存储任何字符
  • Unicode转义序列会在解析代码之前得到处理。要小心注释中的\u
  • 不建议使用char类型
// 例如,"\u0022+\u0022" 其实是一个空串
// 因为 \u0022会在解析之前转换为 " 
// 最后得到 "" + "" 的空串

面试题

Java支持的数据类型有哪些?什么是自动拆装箱?
(1)Java语言支持的8种基本数据类型是:
byte
short
int
long
float
double
boolean
char
(2)自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成Integer,double转化成Double,等等。反之就是自动拆箱。


Java支持的数据类型包括两种:
一种是基本数据类型,包含byte,char,short, boolean ,int , long, float,double;
另一种是引用类型:如String等,其实是对象的引用,JVM中虚拟栈中存的是对象的地址,创建的对象实质在堆中,通过地址来找到堆中的对象的过程,即为引用类型。
自动装箱就是Java编译器在基本数据类型和对应的对象包装类型间的转化,即int转化为Integer,自动拆箱是Integer调用其方法将其转化为int的过程


为什么不使用Double或Float代表货币?
http://codingdict.com/questions/115606
Float与Double精度缺失的原因与避免
https://blog.csdn.net/qfqtzyt/article/details/102977117
货币计算请避免使用float和double
https://www.jianshu.com/p/1a6faab3cae4
Java核心技术卷Ⅰ(原书第10版)第3章
https://www.nowcoder.com/ta/review-java/review?tpId=31&tqId=21073&query=&asc=true&order=&page=5

posted @ 2021-01-06 11:02  张三丰学Java  阅读(244)  评论(0编辑  收藏  举报