再回首,Java温故知新(二):Java基本数据类型

时间:2021-07-30 17:43:36

  Java作为一种强类型语言,意味着每一个变量都会有特定的类型,Java共有8种基本类型,其中有4种整型(byte、short、int、long)、两种浮点型(float、double)、1种字符型(char)和一种布尔型(boolean),值得注意的是,虽然字符串String非常常用,但是它却不属于基本类型。

  一、整型

  整型在表示没有小数部分的数值,允许负数(Java中没有无符号类型,即unsigned),计算机中的存储信息的最小单位是位(bit),存储容量的基本计量单位是字节(Byte),一个字节占8个位,整型数据的取值范围根据其存储的位数计算,即2的N次方,例如byte类型占1个字节,占8个位,所以共有256个值,负数包括-128~-1,正数包括0~127。同理,整型数据的存储需求和取值范围如下:

类型 存储需求(字节) 取值范围
byte 1 -128 ~ 127
short 2 -32768 ~ 32767
int 4 约等于-21亿 ~ 21亿
long 8 正常使用中不太可能溢出,范围约为-92亿亿 ~ 92亿亿

  另外在程序中处理整型数据时可能会用到各种类型的写法,以下列出几种常用的:

写法 含义 备注
12345 十进制 与书面相同
12345L 十进制,长整型(long) 如果数值大于int型数据的最大值却没有加L,会报错
012345 八进制 不推荐,易混淆
0x12345 十六进制 二进制数据的另类表示法,便于书写和记忆
0b10010101 二进制 Java 7新加入的写法,之前版本不支持
1_000_000 字面量分割 与书面中1,000,000相同,Java 7新加入的写法,编译器会自动忽略下划线

  另外对比一下使用场景:int为开发中最常用的整型,大多数情况下都是使用int;long类型适用于数值较大的情况,例如当前时间的毫秒数;byte和short使用较为少见,之应用于特定的场合,例如底层文件处理。

  以下是在大体上略一遍源码时的疑问及解答:

 1.Integer.parseInt和Integer.valueOf有什么区别?

  parseInt返回的是int型数据,而valueOf返回的是Integer封装类型,后者可以调用Integer中的API进行其他操作。

 2.Integer.getInteger是干什么用的?

  在日常开发中接触较少,用来获取系统参数的,源码中调用System.getProperty(String key),然后使用decode进行解析

 3.Integer.decode和Integer.valueOf有什么区别

  前者可以解析0x,#等表示的其他进制,而后者只能转换十进制

 还需要注意的地方有,Byte和Short的compareTo是直接计算差值,即a-b,而Integer和Long的compareTo却是返回-1、0和1;Byte、Short、Integer的hashCode()为返回当前数值的int值,而Long类型的处理方法为return (int)(value ^ (value >>> 32));

  二、浮点型

  浮点型表示有小数部分的数值,java中包括float和double两种浮点型数据,float被称为单精度浮点数,而double被称为双精度浮点数。根据Float类的源码可以得知,Float的最大值为0x1.fffffeP+127f(3.4028235e+38f),最小值为0x0.000002P-126f(1.4e-45f),长度为4个字节;而double精度是float的两倍,最大值为0x1.fffffffffffffP+1023(1.7976931348623157e+308),最小值为0x0.0000000000001P-1022(4.9e-324),长度为8个字节。

  由于float的有效位数只有6~7位,不能满足日常开发工作中的需求,所以在开发过程中大部分使用double型数据,而写法上float型数据需要在数值后加F或f,例如2.13F和3.14f,而浮点型默认则为double型,例如2.13和3.14,当然也可以在后边加上D或者d。在十六进制表示中,浮点型的写法是0x1.****p*,原因推测是因为e是十六进制中的数字表示,所以用p来替换。

  另外值得注意的是,浮点型数据不适用于禁止出现舍入误差的金融计算中,主要是因为浮点型数值采用二进制系统表示,所以无法精确的表示分数,在这种不要不含误差的情况下建议使用BigDecimal类型。

  阅读源码时发现了个比较有意思的地方:

  isNaN(),这个方法貌似没啥用啊,API说明参数是非数字的时候返回true,可是如果参数是非数字的话会报编译错误。

static public boolean isNaN(double v) {
return (v != v);
}

  三、字符型

  char类型用于表示单子字符,Unicode编码单元可以表示为十六进制,范围是从\u0000~\uffff,Java中的char类型使用16位的Unicode字符集,使用时使用英文单引号引起来,例如'A';

  除非确实需要对UTF-16代码单元进行操作,否则建议不要在程序中使用char类型,因为使用char类型使用的编码机制较为久远,已经不能满足目前程序中的使用了,虽然已经改良了char类型的表现方式,但是在某些情况下会出现特殊问题,已知的在数据库char类型与java中的char类型进行对应的时候,在一些特殊查询中会出现问题。建议使用string来处理字符类型,其实java中的string是基于char型数组实现的。

  四、布尔型

  感觉boolean型没什么好说的啊,就是true和false,就连其封装类都简单的要死,就不说什么了,有哪位道友有疑问可以留言。