Java 语言支持的类型分为两类:
基本数据类型
(Primitive Type)和引用类型
(Reference Type)。算法
一个 byte
类型在内存中占 8 位(1字节)范围-128(-2^7) ~ 127(2^7 -1)
express
一个 short
类型在内存中占 16 位(2字节)范围-32768(-2^15) ~ 32767(2^15-1)
数组
一个 int
类型在内存占 32 位(4字节)范围-2147483648(-2^31) ~ 2147483647(2^31-1)
编码
一个 long
类型在内存中占 64 位(8 字节)范围-2^63 ~ 2^63-1
3d
若是直接将一个较小的整数值(在
byte
或者short
类型的范围内)赋给一个byte
或者short
的变量,系统会自动把这个整数值当成byte
或者short
类型来处理.
若是使用一个巨大的整数值(超出 int 类型的范围)时,Java 不会自动把这个整数值当成 long 类型来处理。若是但愿系统把一个整数值当成 long 类型来处理,应在这个整数值后增长l
或者L
作后缀。code
Java 的浮点类型有固定的表数范围和字段长度,字段长度和表数范围与机器无关,Java 的浮点类型遵循 IEEE 标准,采用二进制的科学计数法来表示。对象
一个 float 类型在内存中占 4 字节,32 位,第 1 位是符号位,接下来的 8 位表示指数,在接下来的 23 位表示位数。blog
一个 double 类型在内存中占 8 字节,64 位,第 1 位表示符号位,接下来的 11 位表示指数,在接下来的 52 位表示尾数。接口
由于 Java 浮点数是用二进制的科学计数法来表示浮点数,所以可能不能精确表示一个浮点数。例如把
5.12345f
赋值给一个float
类型的变量,接着输出这个变量时看到这个变量的值已经发生了改变。 若是须要一个精确的浮点数,可使用BigDecimal
类。
浮点类型默认的是double
若是但愿Java
把一个浮点类型值当成float
来处理,应当在这个浮点类型值后面紧跟一个f
或者F
。
Java 还提供了三个特殊的浮点数值:正无穷大,负无穷大和非数,用于表示溢出或者出错。正浮点数除以 0(Java会自动把和浮点数进行运算的整数 0 当成浮点数 0.0 处理)获得正无穷大(Double/Float 类中的 POSITIVE_INFINITY).使用一个负浮点数除以 0 获得负无穷大(Double/Float 类中的 NEGATIVE_INFINITY)
表示。0.0/0.0 将获得一个非数 NaN.
全部的正无穷大以及负无穷大都相等,全部的非数都不相等。
100_000_000_000数值中的_
方便阅读。无实际含义。内存
字符型有三种表示形式
'A'
、'9'
和 '0'
等.'\n'
、'\t'
Unicode
值来表示字符型值,格式是'\uXXXX'
,其中 XXXX
表明 一个十六进制的整数。字符类型也可使用十六进制编码方式来表示,范围是'\u0000'~'\uFFFF'
,一共能够表示 65535
个字符,其中前 256 个('\u0000'~'\u00FF'
)字符和 ASCII 码中的字符彻底重合。
计算机底层保存字符时,实际上保存的是该字符对应的编号,所以 char
类型的值能够直接做为整形使用,它至关于一个 16 位的无符号整数,表数范围是 0~65535
.
若是把 0~65535 范围内的一个 int
整数赋给 char
类型变量,系统自动会把这个 int
整数当成 char
类型来处理
用于表示逻辑上的真
或假
, boolean
类型的数值只能是 true
或者 false
, 不能用 0
或者非0
来表示,其余基本数据类型也不能转换成 boolean
类型。
Java 规范没有强制指定 boolean 类型的变量所占用的内存空间。因为大部分计算机在内存分配时容许的最小内存单元是字节(8 位),所以 bit 大部分时候实际占用 8 位。
Java虚拟机规范一书提到 :
- 在Java虚拟机中没有任何供 boolean值专用的字节码指令,Java语言表达式所操做的
boolean值,在编译以后都使用Java虚拟机中的int数据类型来代替。- Java虚拟机直接支持 boolean类型的数组,虚拟机的 navarra指令参见第6章的newarray小节能够建立这种数组。boolean类型数组的访问与修改共用byte类型数组的baload和 bastore指令。
由于在虚拟机规范中说了,boolean值在编译以后都使用Java虚拟机中的int数据类型来代替,而int是4个字节,那么boolean值就是4个字节。- boolean类型数组的访问与修改共用byte类型数组的baload和 bastore指令,由于二者共用,只有二者字节同样才能通用呀,因此byte数组中一个byte是1个字节,那么boolean数组中boolean是1个字节。
总结:boolean在数组状况下为1个字节,单个boolean为4个字节。
Java 全部的数值类型能够相互转换,若是系统支持把某种基本类型的值直接赋给另外一种基本类型的变量,则这种方式被称为自动类型转换.当把一个表述范围小的数值或者变量直接赋给另外一个表数范围大的变量时,系统能够进行自动类型转换.不然就须要强制转换.
表数范围小的数值赋给表数范围的变量.
Java 支持自动类型转换图:
除了基本类型的自动转换外,把任何基本类型的值和字符串进行链接运算时,基本类型的值将自动转为字符串类型(ps:将基本类型转化为字符串类型时,能够把基本类型的值与空字符串相加).
若是想把上图箭头右边的数据类型转换为左边的类型,则必须进行强制类型转换.强转的格式为(TargetType)value
强制类型转换的运算符是圆括号.
须要注意强制类型转换会形成数据溢出,从而致使数据丢失.
当一个算术表达式中包含多个基本类型的值时, 整个算术表达式的数据类型将发生自动提高.
Java 自动提高规则:
+
: 加法运算符(还能够做为字符串的链接运算符)-
: 减法运算符*
: 乘法运算符/
: 除法运算符%
: 求余运算符++
: 自加。
--
: 自减。单目运算符。与++
相似,只是将操做数 -1&
: 按位与。当两位同时为 1 时才返回 1.|
: 按位或。只要有一位为 1 便可返回 1。~
: 按位非。单目运算符,将操做数的每一个位(包括符号位)所有取反。^
: 按位异或。当两位相同时返回0,不一样时返回 1。<<
: 左移运算符。>>
: 右移运算符.>>>
: 无符号右移运算符.&&
: 与,先后两个操做数必须都是 true
才返回 true
,不然饭后 false
.&
: 不短路与,与 &&
做用相同,但不会短路.||
:或,只要两个操做数一个为true
,则返回 true
,不然返回 false
|
: 不短路或, 做用与 ||
相同,但不会短路.!
: 非. 取反^
: 异或. 当两个操做数不一样时返回 true
,相同时返回 false
?:
三目运算符只有一个,语法格式为(expression) ? if-true-statement : if-false-statement
注意:
自加和自减只能用于惭怍变量,不能用于操做数值直接量、常量或表达式。
=
+=
: 对于 x+=y
,即对应于 x = x + y
-=
: 对于 x-=y
,即对应于 x = x - y
*=
: 对于 x*=y
,即对应于 x = x * y
/=
: 对于 x/=y
,即对应于 x = x / y
%=
: 对于 x%=y
,即对应于 x = x % y
|=
: 对于 x|=y
,即对应于 x = x | y
^=
: 对于 x^=y
,即对应于 x = x ^ y
<<=
: 对于 x<<=y
,即对应于 x = x << y
>>=
: 对于 x>>=y
,即对应于 x = x >> y
>>>=
: 对于 x>>>=y
,即对应于 x = x >>> y
>
: 大于,只支持左右两边操做数是数值类型.>=
: 大于等于,只支持左右两边操做数是数值类型.<
: 小于,只支持左右两边操做数是数值类型.<=
: 小于等于,只支持左右两边操做数是数值类型.==
: 等于,若是比较的两个操做数都是数值类型,即便两个操做数的类型不一样,只要他们值相等,也返回true
. 若是两个操做数都是引用类型,那么比较的是两个操做数的引用地址.!=
: 不等于.数据类型比较,无关类型,只进行值比较.引用类型比较对象的引用地址.()
来控制