Java基本数据类型详解(8大基本数据类型)

Java语言提供了8种基本数据类型,分别是 byte、short、int、long、float、double、boolean、char。

Java基本数据类型详解(8大基本数据类型)-mikechen

Java为基本类型提供语言级别的支持,即已经在Java中预定义,用相应的保留关键字表示。

基本类型是单个值,而不是复杂的对象,基本类型不是面向对象的,主要出去效率方面的考虑,但是同时也提供基本类型的对象版本,即基本类型的包装器(wrapper)。

 

第一类:整数类型

byte 、short 、int 、long
Java基本数据类型详解(8大基本数据类型)-mikechen

1.byte

  • byte 数据类型是8位,用来表示 -128 – 127之间的整数
  • 大小:1个字节
  • 最小值是 -128(-2^7);
  • 最大值是 127(2^7-1);
  • 默认值是 0;

byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一。

例子:

byte a = 20;

 

2.short

用来表示-2^15 – 2^15-1之间的整数。

  • short 数据类型是 16 位、有符号的以二进制补码表示的整数
  • 大小:2个字节
  • 最小值是 -32768 ( -2^15 )
  • 最大值是 32767 ( 2^15 – 1 )
  • short 数据类型也可以像 byte 那样节省空间,一个 short 变量是 int 型变量所占空间的二分之一
  • 默认值是 0

例子:

short b = 20;

 

3.int

可以表示的数为-2^31 – 2^31-1。

int 数据类型是 32 位、有符号的以二进制补码表示的整数
大小:4字节
最小值是 -2,147,483,648 ( -2^31 )
最大值是 2,147,483,647 ( 2^31 – 1 )
一般地整型变量默认为 int 类型
默认值是 0

例子:

int i = 10;

 

4.long

可以表示的数为 -2^63 — 2^63-1,常用来表示int表示不了的整数类型。

  • long 数据类型: 64 位、有符号的以二进制补码表示的整数
  • 大小:8字节
  • 最小值:-9,223,372,036,854,775,808 ( -2^63 )
  • 最大值: 9,223,372,036,854,775,807 ( 2^63 -1 )
  • long 类型主要使用在需要比较大整数的系统上
  • 默认值是 0L

例如System.currentTimeMills()方法,返回的是1970.1.1到今天所经历的毫秒数。

这个数字就是int所不能表达的,必须用long来表达。如果long类型还不能表达你所要的整数,推荐用bigInteger,可以表示任意的整数。

 

第二类:浮点数类型

Java基本数据类型详解(8大基本数据类型)-mikechen

1.float

float:单精度类型,32 位,后缀 F 或 f。

  • float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
  • 大小:4字节
  • float 在储存大型浮点数组的时候可节省内存空间;
  • 默认值是 0.0f;
  • 浮点数不能用来表示精确的值,如货币;

例子:

float f1 = 234.5f

2.double

常用来表示浮点数。

  • double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
  • 大小:8字节;
  • 浮点数的默认类型为 double 类型;
  • double类型同样不能表示精确的值,如货币;
  • 默认值是 0.0d;

例子:

double d = 10.0d;

如果double类也无法达到你所要表示的浮点数,推荐使用BigDecimal来表示,他可以表示任意的浮点数。

 

第三类:布尔类型

Java基本数据类型详解(8大基本数据类型)-mikechen

boolean 没有什么好说的,它的取值就两个:true 、false 。

 

第四类、字符类型

Java基本数据类型详解(8大基本数据类型)-mikechen
char:2字节

char 类型是一个单一的 16 位 Unicode 字符;

最小值是 \u0000(十进制等效值为 0);

最大值是 \uffff(即为 65535);

char 数据类型可以储存任何字符;

例子:

char c = 'c';

 

Java包装类

Java 中为每一种基本数据类型提供了相应的包装类,如下:

  • Byte <-> byte
  • Short <-> short
  • Integer <-> int
  • Long <-> long
  • Float <-> float
  • Double <-> double
  • Character <-> char
  • Boolean <-> boolean

引入包装类的目的就是:提供一种机制,使得基本数据类型可以与引用类型互相转换。

 

基本数据类型与包装类型的区别:

1. 包装类是对象,拥有方法和字段,对象的调用都是通过引用对象的地址,基本类型不是;

2. 包装类型是引用的传递,基本类型是值的传递;

3. 声明方式不同,基本数据类型不需要new关键字,而包装类型需要new在堆内存中进行new来分配内存空间;

4. 存储位置不同,基本数据类型直接将值保存在值栈中,而包装类型是把对象放在堆中,然后通过对象的引用来调用他们,因此,包装类的效率会比基本数据类型的效率要低。

5.初始值不同,比如:int的初始值为0、boolean的初始值为false,而包装类型的初始值为null;

6. 使用方式不同,基本数据类型直接赋值使用就好,而包装类型是在集合,比如Collection、Map时会使用。

 

装箱和拆箱

基本数据类型与包装类的转换被称为装箱和拆箱。

装箱(boxing)是将值类型转换为引用类型。例如:int 转 Integer

装箱过程是通过调用包装类的 valueOf 方法实现的。

拆箱(unboxing)是将引用类型转换为值类型。例如:Integer 转 int

拆箱过程是通过调用包装类的 xxxValue 方法实现的。(xxx 代表对应的基本数据类型)。

例子:

Integer i = 10;  //装箱
int n = i;   //拆箱

一句话总结:装箱就是 自动将基本数据类型转换为包装器类型,拆箱就是  自动将包装器类型转换为基本数据类型。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法