概要: java注重数据类型的统一性,不同的数据类型之间并不能进行赋值或者运算。就好像对定义为猫的数据类型,不能把狗的特性加到上面一样。但对于某些特殊的数据类型来说,我们可以通过强转的方式使两者之间的数据类型保持一致,继而进行赋值或者计算的操作。
java的数据类型主要有两大类,分别为基本数据类型和引用数据类型。此处仅仅介绍基本数据类型,引用数据类型在以后的章节中再做论述。
java-基本数据类型
java中的基本数据类型可细分为8类,而按照数据类型之间的特性又可分为三种,分别为整形、浮点型和布尔值。下面针对这三种分别介绍。
整型
整型数据是指变量为整数的数据类型,包括byte,short,int,long,char五种基本类型。下面是各自的介绍。
- byte
byte是java中最小的整数类型,由一个字节组成(8bit),取值范围是【-128~127】。在这里,如果试图把取值范围外的数赋值为byte类型的变量,则容易出现编译错误。如图
而如果是取值范围内的数据,通过计算之后超出取值范围的话,可能不会出现编译错误的情况,但注意的是其计算结果会错误,如图:
这里原本是128的值,为什么结果却是-128?此处涉及了计算机二进制运算的问题,篇幅所致不宜说太多,以后如有需要再开一章介绍。在此只需要将数据理解为一个首尾相接的循环体,127的后一位(128)为-128,以此类推,超出取值范围多少,则从其最值(最小或最大)处加上多少为最后的计算结果。这个使用于所有的整型运算。 - short
short由2个字节组成,取值范[-2^15,2^15-1],在实际应用中使用比较少,当需要计算的数据较byte大且机器内存比较小时可考虑使用该数据类型,但目前手机硬件系统比较完善,内存一般都足够使用了。 - int
int为整型数据的默认形式,也是最常用的整型数据类型,其由4个字节(32bit)组成,取值范围自然就为【-2^31,-2^31-1】。该范围基本满足了当前计算机的大部分数据计算需求。因此,为了避免运算数据溢出的情况,一般情况下都使用int作为整型数据类型的默认形式而不用担心占用过多的内存导致机器运转缓慢的问题。 - long
long类型为int类型的“进阶版”,由8个字节(64bit)组成。其取值范围则【-2^63,2^63-1】这个数值绝对满足当前计数机处理整型数据的需求,因此,理论上使用它是最能避免数据溢出的问题,但因为其占用的字节过大,对内存而言会造成很大的浪费,不利于机器的运行,所以目前运用该类型的数据也比较少,除非需要运算的数据量过大。
注意:使用long类型时,需要在数值后面加上L,以供编译器确认,否则编译器会默认为int类型,一旦数值超出int类型的取值范围,则报错。
值得一提的是,在不添加L进行声明的情况下,一旦有变量是通过数值运算而超出了int取值范围时,编译器不会报错,也不会出现数据溢出的情况。 - char
java中的char类型使用unicode作为字符编表,其取值范围为【0,65595】,即0-2^16-1。由此可见,java中的char类型在字符中占两个字(16bit)。char类型最大的作用不是数值运算,而是显示字符,譬如char=‘A’;于是有人会疑惑为什么显示字符的char类型会归属到整形数据类型上来,这是因为,char类型本质上仍然属于整型类型的一个子集,只不过赋予了其他的含义,但我们仍可以把他当做一个整型数据来进行运算。当然,我们也可以直接通过数值给char赋值。
浮点型
浮点型可简单理解为小数类型,共有float和double两种数据类型。下面一一介绍。
1. float
float由4个字节组成,代表其精度为7-8位,所谓精度,指精确到小数点后多少位,因为编译器处理结果的不同,float类型的数据精确度为7-8位,又叫单精度。
2. double
double类型由8个字节组成,同long一般,使用时需要加上后缀d供编译器识别,其可精确到小数点后16位,因此又叫双精度。
**简记**8以内用float,15以内用double
布尔值
布尔值是java中用来进行逻辑判断的数据,其中true为真,false为假。可以理解为1和0。其占1个字节,级true=00000001,false为00000000;布尔值不参与数值运算,仅仅作为逻辑判断。
基本数据类型的运算规则和特殊值
- 计算结果的数据类型,与运算项中范围最大的类型一致
- 这里有人可能疑问第二点整型赋值给浮点型为什么不需要加强转符号。这里涉及的一个知识点为
向上强转(小转大)为默认强转,无需加符号,数据不丢失。
向下强转(大转小),需加强转符供编译器识别,同时从低位到高位截取对应位值数,其余全部丢弃,会造成数据的丢失 - byte,short,char等比int范围小的整数在运算时,会先自动转成 int
特殊值
- Infinity 表示无穷大,当计算分母为0时会得出此值
- NaN 表示没有这个数(Not a Number)当负数开方时会得出此值。
运算符
【1】 + - * / -> 简单的数值运算
【2】 + -> 数学运算,字符串连接运算
【3】 % -> 取余运算
【4】 > -> 大于
>= -> 大于等于
< -> 小于
<= -> 小于等于
== -> 等于
!= -> 不等于
【注】:比较大小,返回的是布尔值
【5】 && 1.逻辑与 两侧同时是真结果是真,任意一侧是假结果是假
2.短路与 左侧是假,右侧被忽略
【6】|| 1.逻辑或 两侧同时是假结果是假,任意一侧是真结果是真
2.短路或 左侧是真,右侧被忽略
【7】 ! 非 真变假,假变真 可以做相反条件判断
【8】 & 位与 两位同时是1结果是1,任意一位是0结果是0
【9】 | 位或 两位同时是0结果是0,任意一位是1结果是1
【10】 ^ 异或 不同是1,相同是0 -> 对同一个值异或两次,得到原值(|可作为加密运算的一种方式)
【11】 ~ 求反
【12】 >> 带符号向右移位, 符号位是0左侧补0,符号位是1左侧补1
【13】 >>> 不带符号右移位, 不管符号位是0是1, 左侧都补0
【14】 << 向左移位
【注】1.向右移动一位相当于除2
2.向左移动一位相当于乘2
【15】 ++ 自增 ++a,先+1,再赋值
a++,先赋值,再+1
【16】-- 自减 --a,先-1,再赋值
a--,先赋值,再-1
【17】 ? : 三项运算符
【18】 = 赋值运算
【19】 == 等号值