Java中基本数据类型

Java中基本数据类型

夯实Java基础,为架构师而努力。

8大基本数据类型对比

Java有的8个基本数据类型: byteshortintlongfloatdoublebooleanchar,同时每种都有其对应的包装类型: ByteShortIntegerLongFloatDoubleBooleanCharacter。今天的主角是8个基本数据类型。为了表示得更清楚,通过一个表格来说明8个基本数据类型占用的字节数、占用多少位、默认值、最大值、最小值。

数据类型字节数位数默认值最小值最大值包装类型
byte180-128127Byte
short2160-3276832767Short
int4320-231231 -1Integer
long8640L-263263 - 1Long
float4 (单精度)320.0f1.4e-45f3.4028235e+38fFloat
double8 (双精度)640.0d4.9e-3241.7976931348623157e+308Double
boolean falseNANABoolean
char216\u0000'\u0000'(即为0)'\uffff'(即为65,535)Character

关于boolean的字节数和位数我们后面再讨论,有很多种说法

关于int和long 的最小值和最大值

每种数据类型的最小值和最大值都在其包装类型中有定义,比如说int的包装类型Integer中定义的int的最小值和最大值如下:

// int最小值-2^31: -2147483648
public static final int   MIN_VALUE = 0x80000000;
// int 最大值2^31: -1 2147483647
public static final int   MAX_VALUE = 0x7fffffff;

基本数据类型long的包装类型Long中的最小值和最大值如下:

// long最小值-2^63: -9223372036854775808
public static final long MIN_VALUE = 0x8000000000000000L;
// long最大值2^63-1:9223372036854775807
public static final long MAX_VALUE = 0x7fffffffffffffffL;

byte、short、int、long

这四个基本数据类型都是整型的数据类型,一般代码中不带符号的整型字面量,几乎都是int类型的。如果需要定义long类型的变量,需要在整型字面量后面加上大写的Ll,但小写的l和整数1很相似,为了代码的可读性,一般都要求写成大写的L

字面量

在说这整型数据类型之前,需要先来说说字面量。

见名知意,字面量就是我们见到的字表面的大小。int i = 100,100就是字面量。String s = "abc""abc"就是字面量。

在Java中,一个整型的字面量,只有以Ll结尾,那就是long类型的字面量,否者都是int类型的字面量。超出int范围的long类型值可以从long字面值创建。

整型数据类型byteshortintlong 都可以通过 int类型的字面量定义而来。

使用方法

byte b = 1;
short s = 0;
int i = 100;
long l = 22L;

float、double

关于floatdouble需要知道floatdouble不能用于表示精确的值,比如说货币。如果要表示货币这种精度要求非常高的数据,请尽量使用BigDecimal

float是单精度、占4个字节,单精度的浮点数有效数字是8位。

double是双精度,占8个字节,双精度的浮点数有效数字是16位。

判断浮点型字面量类型

如何判断一个浮点型字面量是什么类型的,如果这个浮点字面量以Ff结尾,就是float类型的,否者这个字面量就是double类型。

如果你想节约内存,可以使用float。

use a float (instead of double) if you need to save memory in large arrays of floating point numbers.

注意:float是8位有效数字,第7位数字将会四舍五入

使用方法

float f = 0.0f;
double d = 0.0d; // 或 double d = 0.0;

float和double可以也可以使用科学记数法(e)来定义:

double d1 = 123.4;
// 和d1的值是一样的,只不过使用的是科学记数法
double d2 = 1.234e2;

来说一道面试题:3*0.1==0.3将会返回什么?true还是false? 答案:false

char

char类型数据可以任何字符。且只能表示一个字符。

char类型是可以运算的因为char在ASCII字符编码表中,有对应的数值。

在Java中,对char类型字符运行时,直接当做ASCII码整数对待。

char c1 = 'a';
char c2 = 'b';
System.out.println(c1 + c2);
// --------输出---------
195

boolean

boolean很简单,它的默认值是false,且只有两个值truefalse。但是boolean到底占几个字节呢?

我比较赞同的一种说法是4个字节,理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。

上面描述引自: 你真的知道Java中boolean类型占用多少个字节吗?

Java虚拟机规范

The Java Virtual Machine encodes boolean array components using 1 to represent true and 0 to represent false. Where Java programming language boolean values are mapped by compilers to values of Java Virtual Machine type int, the compilers must use the same encoding.

其实还有两种说法

  • 1个bit

    理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。

  • 1个字节

    理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。

数据类型之间的转换

数据类型之间是可以转换的,除了boolean之外,其他7个数据类型是可以相互转换的,并且有一个很专业的名字--自动类型转换

数据类型之间的转换

虽然数据类型之间可以相互转换,但是还是要注意下面几点:

  • boolean不能转换成其他基本类型
  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换,且会存在精度丢失的问题。
  • 转换过程中可能会溢出或精度丢失。
  • 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入。

自动类型转换

自动类型转换也叫做隐式类型转换。

自动类型转换

用文字的话,就可以如下表达:

  • byte型可以转换为short、int、long、float和double
  • short可转换为int、long、float和double
  • char可转换为int、long、float和double
  • int可转换为long、float和double
  • long可转换为float和double
  • float可转换为double;

自动类型转换必须满足转换前的数据类型的位数要低于转换后的数据类型

比如说short类型数据可以自动转换成int类型的数据,float类型的数据可以自动转换成double类型的数据。

强制类型转换

将容量大的数据类型转换成容量小的数据类型只能使用强制类型转换, 并且可能出现溢出。

强制类型转换的格式: byte i = (byte) 123;

比如说:

int i = 128;
byte j = (byte) i; // 这个时候就有可能出现溢出

参考文献

[Java语言规范](

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://baozi.fun/2019/10/21/8-primitive-type

Buy me a cup of coffee ☕.