重温Java基础(一):数据类型

​写在前面

 

从事Java开发工作已近十年,从最初的懵懵懂懂,到现在的“不知所措”。随着知道的越多,不知道的也越多。但不管技术怎么发展,始终离不开基础知识。所以,近段时间开始,将重温Java技术的基础知识,主版本为Java8,中间可能也会穿插一些其它版本,如Java7。谨以此系列文章,来记录重温Java基础的历程。

 

本章重点


本章将介绍Java的数据类型。

 

数据类型

 

Java是一种强数据类型语言,相对的,JavaScript是一种弱数据类型语言。Java中一种有八种基本数据类型(primitive type),其中包括六种数字类型(四个整数型,两个浮点型),一种字符类型(用于表示Unicode编码的字符单元),还有一种布尔型。

 

整型

整形用于表示没有小数部分的数值,且允许为负数。Java共提供了4种整数形,具体内容如下。

类型

存储长度

取值范围

int

4字节

-2 147  483 648 ~ 2 147 483 648

short

2字节

-32768 ~ 32767

long

8字节

-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807

byte

1字节

-128 ~ 127

 

在开发过程中,int类型最为常用。如果要表示现阶段中国的人数,那么int类型足以,最大20亿,而int类型最大只超过了20亿。但是如果要表示全球人口,那么就要使用long类型了。byte和short类型主要用于特定的应用场景,如底层文件处理、需要控制占用存储空间量的大数组。

还记得Java的广告词吗?一次编译,到处运行。其中一个重要因素,就是在Java中,整形的取值范围与运行Java代码的机器无关。此举也正好解决了软件从一个平台移植到另一个平台、或者同一个平台中不同操作系统之间的移植带来的诸多问题。

 

特殊前缀/后缀

长整形数值可用一个L或者l(如9000000000L)来表示。一般情况下,建议用L来表示,因为l容易和1混淆。

十六进制数值有一个前缀0x或者0X(如0xCAFD)。

八进制数字有一个前缀0。例如,010对应八进制中的8。不言而喻,八进制表示法比较容易混淆,因此建议最好不要使用八进制常数。

Java7开始,二进制数字可以加上前缀0b或者0B。例如,0b1001即为9。同时,从Java7开始,还可以为数字字面量加上下划线,如用1_000_000(或0b1111_0100_0010_0100_0000)来表示一百万。这些下划线无任何特殊意义,和,一样,只是为了让人更易读。Java编译器会自动去除这些下划线,但是,,并不会自动去除,仅限于_。

 

浮点类型

浮点类型用于表示有小数部分的数值。Java中有两种浮点类型,具体内容如下。

类型

存储

取值范围

float

4字节

约 ± 3.402 823 47E+38F(有效位数6 ~ 7位)

double

8字节

约 ± 1.797 693 134 862 315 70E+308(有效位数15位)

double也称为双精度类型,数值精度是float类型的两倍。大部分情况应用程序都采用double类型,因为float类型的精度难以满足需求。很少的情况适合使用float类型,例如,需要单精度数据,或者需要存储大量数据。

 

特殊前缀/后缀

float类型数值可用后缀F或f(如5.23F)。没有后缀F的浮点值(如5.23)会被默认为double类型。同样的,也可以在浮点数值后面添加后缀D或d(例如5.22D)。

所有的浮点数值计算都遵循 IEEE 754 规范。具体来说,下面是用于表示溢出和出错情况的三个特殊的浮点数值:

  • 正无穷大

  • 负无穷大

  • NaN(不是一个数字)

如,一个正整数除以0的结果为正无穷大。计算0/0或者负数的平方根结果为NaN。

 

特别说明

 

不能使用 == 来判定一个特定值是否等于Double.NaN,可以使用Double.isNaN(x)

浮点类型不适用于无法接受舍入误差的金融或其它计算中。如2.0 -1.1将计算出0.8999999999999999,而不是想象中的0.9。造成此误差的主要原因是浮点数值采用二进制表示,但是在二进制中无法精确表示分数1/10。同样的,十进制同样也无法精确地表示分数1/3一样。如果在数值计算中不允许有任何舍入误差,应该使用BigDecimal,后续将介绍这个类。

 

char 类型

char类型用以表示单个字符。

随着岁月飞逝,情况已经有所变化。有些Unicode字符可以用一个char值描述,另外一个Unicode字符则需要两个char值。对于此,又是一段故事。

char类型字面量需要用单引号括起来。例如,'A'是编码值为65所对应的字符串常量。与"A"不同,"A"是包含一个字符A的字符串。char类型的值可以表示为十六进制值,其范围从 \u0000 (0)到 \Uffff(65535)。如 \u03C0 表示希腊字母π。

表示特殊字符的转义序列

转义序列

名称

Unicode值

\b

退格

\u0008

\t

制表

\u0009

\n

换行

\u000a

\r

回车

\u000d

\''

双引号

\u0022

\'

单引号

\u0027

\\

反斜杠

\u005c

所有这些特殊的转义序列都可以出现在加引号的字符字面量或字符串中。如'\u2122'或者"Hello World!\n"。转义序列\n还可以出现在加引号的字符常量或字符串之外(其它所有转义序列则不可以)。如:public static void main(String\u0058\u005D args),则完全符合语法规则,\u0058 和 \u005D 是 [ 和 ] 的编码。

 

特别说明

Unicode转义序列会在解析代码之前处理。例如,"\u0022+\u0022"并不是一个由引号(U+0022)包围加号构成的字符串。实际上,\u0022会在解析之前转换为为",最终会得到""+"",也就是一个空字符串。

另外,一定要小心注释中的\u。

比如,注释 // c:\user也会产生一个语法错误,因为\u后面未紧跟着4个十六进制数值。

 

boolean 类型

boolean(布尔)类型有两个值:false 和 true。主要用于判断逻辑条件。整形和布尔类型不能进行相互转换。

 

源码


github

https://github.com/liuminglei/ReviewJavaFoundation/tree/master/01/DataType

gitee

https://gitee.com/xbd521/ReviewJavaFoundation/tree/master/01/DataType

 

 

 

本文系【银河架构师】原创,如需转载请在文章明显处注明作者及出处。

微信搜索【银河架构师】,发现更多精彩内容。

重温Java基础(一):数据类型