Java 的数据类型(学习 Java 编程语言 009)

Java 中共有 8 中基本类型(Primitive type),其中有 4 种整型、2 种浮点型、1 种字符类型 char 和 1 种 boolean 类型。在 Java 中,所有的数值类型所占据的字节数量与平台无关。

1. 整型

整型用于表示没有小数部分的数值,它允许是负数。Java 提供了 4 种整型:byte、short、int 和 long。

类型 存储需求 取值范围
byte 1 字节 -128 ~ 127
short 2 字节 -32 768 ~ 32 767
int 4 字节 -2 147 483 648 ~ 2 147 483 647 ( 刚好超过 20 亿 )
long 8 字节 -9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807
//Byte 最小值: -128
int minByte = Byte.MIN_VALUE;
// Byte 最大值: 127
int maxByte = Byte.MAX_VALUE;

// Short 最小值: -32768
int minShort = Short.MIN_VALUE;
// Short 最大值: 32767
int maxShort = Short.MAX_VALUE;

// Int 最小值: -2147483648
int minInt = Integer.MIN_VALUE;
// Int 最大值: 2147483647
int maxInt = Integer.MAX_VALUE;

// Long 最小值: -9223372036854775808
long minLong = Long.MIN_VALUE;
// Long 最大值: 9223372036854775807
long maxLong = Long.MAX_VALUE;

在通常情况下,int 类型最常用。byte 和 short 类型主要用于特定的应用场合,例如,底层的文件处理或者存储空间很宝贵时的大数组。

在 Java 中,整型的范围与运行 Java 代码的机器无关。这就解决了软件从一个平台移植到另一个平台,或者在同一个平台中的不同操作系统之间进行移植给程序员带来的诸多问题。由于 Java 程序必须保证在所有机器上都能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。

  • 长整型数值有一个后缀 L 或 l(如 4000000000L)。
  • 十六进制数值有一个前缀 0x 或 0X(如 0xCAFE)。
  • 八进制有一个前缀 0(如 010 对应八进制中的 8),八进制表示法比较容易混淆,不建议使用。
  • 二进制有一个前缀 0b 或 0B(从 Java 7 开始)。

从 Java 7 开始,还可以为数字字面量加下划线,如用1_000_000(或用 0b1111_0100_0010_0100_0000) 表示一百万。这些下划线只是为了让人更易读。Java 编译器会去除这些下划线。

Java 中没有任何无符号(unsigned)形式的 int、long、short 或 byte 类型。

如果要使用不能为负数的整数值而且确实需要额外的一位(bit),也可以把有符号整数解释为无符号数,需要非常仔细。例如,一个 byte 值 b 可以不表示范围 -128 到 127,如果想表示 0 到 255 的范围,也可以存储在一个 byte 中,基于二进制算术运算的性质,只要不溢出,加法、减法和乘法都能正常运算,需要调用 Byte.toUnsignedInt(b) 来得到一个 0 到 255 的 int 值,然后处理这个值,再把它转换会 byte。Integer 和 Long 类都提供了处理无符号除法和求余数的方法。

byte b;
int uByte;

b = -1;
uByte = Byte.toUnsignedInt(b);
System.out.println(uByte);       // 输出 255
System.out.println((byte)uByte); // 输出 -1

b = -2;
uByte = Byte.toUnsignedInt(b);
System.out.println(uByte);       // 输出 254
System.out.println((byte)uByte); // 输出 -2

b = 0;
uByte = Byte.toUnsignedInt(b);
System.out.println(uByte);       // 输出 0
System.out.println((byte)uByte); // 输出 0

b = 1;
uByte = Byte.toUnsignedInt(b);
System.out.println(uByte);       // 输出 1
System.out.println((byte)uByte); // 输出 1

浮点类型

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

类型 存储需求 取值范围
float 4 字节 大约 ± 3.402 823 47E+38F (有效位数为 6 ~ 7 位)
double 8 字节 大约 ± 1.797 693 134 862 315 70E+308 (有效位数为 15 位)

double 表示这种类型的数值精度是 float 类型的两倍(有人称之为双精度数值)。在很多情况下,float 类型的精度并不能满足需求。只有很少的情况适合 float 类型。例如,需要单精度数的库,或者需要存储大量数据时。

  • float 类型的数值有一个后缀 F 或 f(例如,3.14F)。
  • double 类型在浮点数值后面添加后缀 D 或 d (例如, 3.14D)。没有后缀 F 的浮点数值(如 3.14)默认为 double 类型。

注释: 可以使用十六进制表示浮点数值。例如,0.125=2-3 可以表示成 0xl.0p-3。在十六进制表示法中,使用 p 表示指数,而不是 e。 注意,尾数采用十六进制,指数采用十进制。指数的基数是 2,而不是 10。

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

  • 正无穷大 - Double.POSITIVE_INFINITY
  • 负无穷大 - Double.NEGATIVEJNFINITY
  • NaN(不是一个数字)- Double.NaN

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

注释: 常量 Double.POSITIVE_INFINITYDouble.NEGATIVEJNFINITYDouble.NaN ( 以及相应的 Float 类型的常量)分别表示这三个特殊的值,但在实际应用中很少遇到。

如果要检测一个特定值是否等于 Double.NaN
if (Double.isNaN(x)) // check whether x is "not a number"
所有“ 非数值” 的值都认为是不相同的。然而,可以使用 Double.isNaN 方法来判断。

警告: 浮点数值不适用于无法接受舍入误差的金融计算中。例如,命令 System.out.pritnln(2.0 - 1.1) 将打印出 0.8999999999999999,而不是人们期望的 0.9。这种舍入误差的主要原因是浮点数值采用二进制系统表示,而在二进制系统中无法精确地表示分数 1/10。这就好像十进制无法精确地表示分数 1/3 —样。如果在数值计算中不允许有任何舍入误差,就应该使用 BigDecimal 类。

boolean 类型

boolean(布尔)类型有两个值:false 和 true,用来判定逻辑条件。

整形值和布尔值之间不能进行相互转换。

char 类型

char 类型原本用于表示单个字符,char 类型描述了 UTF-16 编码中的一个代码单元。

强烈建议不要在程序中使用 char 类型,除非确实需要处理 UTF-16 代码单元。最好将字符串作为抽象数据类型处理。

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

一些用于表示特殊字符的转移序列和转义序列 \u 可以出现在字符字面量或字符串中('\u2122' 或 "Hello\n")。转移序列 \u 还可以出现在加引号的字符常量或字符之外(其他所有转义序列不可以)。例如 public static void main(String\u005B\u005D args), \u005B 和 \u005D 分别是 [ 和 ] 的编码。

特殊字符的转义序列

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

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

更隐秘地, 一定要当心注释中的 \u。 注释
// \u00A0 is a newline
会产生一个语法错误,因为读程序时 \u00A0 会替换为一个换行符。类似地,下面这个注释:
// Look inside c:\users
也会产生一个语法错误, 因为 \u 后面并未跟着 4 个十六进制数。

Unicode

在 Unicode 出现之前,已经有许多种不同的标准:美国的 ASCII、西欧的 ISO 8859-1、俄罗斯的 KOI-8、中国的 GB 18030 和 BIG-5等。这样产生了 2 个问题:

  • 对于任意给定的代码值,在不同的编码方案下有可能对应不同的字母。
  • 采用大字符集的语言编码长度可能不同。例如,有些常用的字符采用单字节编码,而另一些字符则需要两个或多个字节。

设计 Unicode 编码的目的就是要解决多个编码标准产生的问题。

码点 ( code point ) 是指与一个编码表中的某个字符对应的代码值。在 Unicode 标准中, 码点采用十六进制书写,并加上前缀 U+, 例如 U+0041 就是拉丁字母 A 的码点。Unicode 的码点可以分成 17 个代码级别(codeplane)。第一个代码级别称为基本的多语言级别(basic multilingual plane ), 码点从 U+0000 到 U+FFFF,其中包括“经典”的 Unicode 代码;其余的 16 个级别码点从 U+10000 到 U+10FFFF,其中包括一些辅助字符(supplementary character)。

有些 Unicode 字符可以用一个 char 描述值,另外一些 Unicode 字符则需要两个 chart 值。

UTF-16 编码采用不同长度的编码表示所有 Unicode 码点。在基本的多语言级别中,每个字符用 16 位表示,通常被称为代码单元(code unit); 而辅助字符编码为一对连续的代码单元。采用这种编码对表示的各个值落入基本的多语言平面中未使用 2048 个值范围内,通常被称为替代区域(surrogate area) (U+D800 ~ U+DBFF 用于第一个代码单兀,U+DC00 ~ U+DFFF 用于第二个代码单元)。这样设计十分巧妙,我们可以从中迅速地知道一个代码单元是一个字符的编码, 还是一个辅助字符的第一或第二部分。例如,𝕆 是八元数集的一个数学符号,码点为 U+1D546,编码为两个代码单元 U+D835 和 U+DD46。

String str = "\ud835\udd46";
System.out.println(str); // 输出 𝕆

greeting = "𝕆";
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345