3.2 Java 数据类型

Java是一种强类型语言,每个变量都必须声明其类型。
Java的数据类型分为两大类:基本类型(primitive type)和引用类型(reference type)
Java中定义了3类8种基本数据类型,其中有4种整型,2种浮点型,1种用于表示Unicode编码的字符单元的字符类型char和1种用于表示真值的boolean类型。Java中没有无符号类型。
逻辑型:boolean
文本型:char
数值型:byte, short, int, long, float, double

注:引用数据类型的大小统一为4个字节,记录的是其引用对象的地址!

整形

整型用于表示没有小数部分的数值,它允许是负数,Java提供了4种整型:

类型 存储需求 取值范围
int 4字节 -21474483648~21474483647(正好超过20亿)
short 4字节 -32768~32767
long 8字节 -9223372036854775808~9223372036854775807
byte 2字节 -128~127

Java 语言整型常数的三种表示形式:
十进制整数,如:99, -500, 0。
八进制整数,要求以 0 开头,如:015。
十六进制数,要求 0x 或 0X 开头,如:0x15 。

Java语言的整型常数默认为int型,声明long型常量可以后加‘ l ’或‘ L ’ ,如:

1
2
long a = 55555555; //不出错,在Int表示的范围内(21亿内)。
long b = 55555555555;//不加l出错,已经超过int表示的范围。报错:The literal 55555555555 of type int is out of range

浮点类型

浮点类型用于表示有小数部分的数值,Java中有两种浮点类型:

类型 存储需求 取值范围
float 4字节 -3.4E38(-3.41038)~3.4E38(3.41038)
double 8字节 -1.7E308(-1.710308)~1.7E308(1.710308)

float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。
double表示这种类型的数值精度是float类型的两倍,又被称作双精度,绝大部分应用程序都采用double类型。

Java 浮点类型常量有两种表示形式
十进制数形式,例如:3.14,314.0,0.314
科学记数法形式,例如:314e2,314E2,314E-2

1
2
double f = 314e2; //314*10^2-->31400.0
double f2 = 314e-2; //314*10^(-2)-->3.14

Float类型的数值有一个后缀F/f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D/d, 以明确其为double类型:

1
2
float a = 123.4F // 后面加个F,表示float类型
double d = 123.456D // 后面的D跟不跟都可以

浮点类型float, double的数据不适合在不容许舍入误差的金融计算领域。
如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
注:
主要理由:由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于。
二进制浮点数不能精确的表示0.1,0.01,0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。
最好完全避免使用浮点数比较:

1
2
3
4
5
6
7
8
9
10
11
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d); //false
float d1 = 423432423f;
float d2 = d1+1;
if(d1==d2){
System.out.println("d1==d2");
}else{
System.out.println("d1!=d2");
}

浮点数使用总结:

  1. 默认是double
  2. 浮点数存在舍入误差,很多数字不能精确表示。主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数1/10。这也是浮点数的名字由来。如果需要在数值计算中不含有任何舍入误差,就应该使用BigDecimal类。
  3. 避免比较中使用浮点数

大数值:

Java.math下面的两个有用的类:BigInteger和BigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。

数据的溢出

当整数的数据大小超出了可以表示的范围,而程序中又没有做数值范围的检查时,这个整型变量所输出的值将发生紊乱,且不是预期运行的结果。
当一个数字已经是最大或最小值的时候,再进行增加或减少操作,就会产生数据的溢出。如果想避免数据的溢出或解决数据溢出的问题,可以采用扩大数据范围的方式完成。

char类型

char(字符)类型用于表示单个字符,通常用来表示字符常量。采用16 位的Unicode编码来表示,其范围从\u0000到\Uffff。有足够的空间保存非英文字符,在内存中占有2个字节。计算机处理字符类型时,是把这些字符当成不同的整数来看待,因此,严格来说,字符类型也算是整数类型的一种。
特殊字符的转义序列符

转义序列 名称 Unicode 转义序列 名称 Unicode
\b 退格 \u0008 \” 双引号 \u0022
\t 制表 \u0009 \’ 单引号 \u0027
\n 换行 \u000a \ 反斜杠 \u005c
\r 回车 \u000d \f 换页

boolean类型

boolean (布尔) 类型的变量是用来判断逻辑条件。只有true(真)和false(假)两个值,也就是说,当将一个变量定义成布尔类型的时候,它的值只能是true或false,除此之外,没有其他的值可以赋值给这个变量。

1
boolean flag = true ; // 声明布尔变量flag,并赋值为true。

基本数据类型的默认值

数据类型 默认值
byte (byte) 0
short (short) 0
int 0
long 0L
float 0.0f
double 0.0d
char \u0000 (空)
boolean false

数据类型的转换

Java的数据类型在定义时就已经确定了,因此不能随意转换成其他的数据类型,但Java允许用户有限度地做类型转换处理。数据类型的转换方式可以分为“自动类型转换”和“强制类型转换”。

  1. 数据类型的自动转换:
    a、 转换前的数据类型与转换后的类型兼容。
    b、 转换后的数据类型的表示范围比转换前的类型大。
    注:String 表示一个字符串,可以直接声明的方式完成定义。任何的数据类型的数据都可以向String转型。
  2. 数据类型的强制转换:

    1
    2
    3
    float f = 30.3f ; // 浮点型
    int x = (int) f // 强制类型的转换
    System.out.println(“10/3 = ”+((float)10/3)); // 执行强制转换

    强制类型转换通过截断小数部分将浮点值转换为整数。如果想对浮点数进行舍入运算,以便得到最接近的整数,那就需要使用Math.round方法。round方法返回值为long类型。

    1
    2
    double x = 9.997 ;
    int nx = ( int ) Math.round( x ) ; // nx 的值为10
坚持原创技术分享,您的支持将鼓励我继续创作!