Java数据类型分为:
基本数据类型
引用数据类型
1.基本数据类型
Java语言共有8种基本类型。
1.1 整数型
byte 取值范围(-128~127)2^7
默认值为0
short 取值范围(-32768~32767)2^15
默认值为0
int 取值范围(-2,147,483,648~2,147,483,647)2^31
一般口述答正负21亿即可
默认值为0
long 取值范围(-9,223,372,036,854,775,808~9,223,372,036,854,775,807)2^63
默认值是0L,使用long型整数时后方要加上L。一般用在需要大型整数的场景
比long还要大的基本整数类型没有了,有引用数据类型 BigInteger,它是没有取值范围的。
1.2 浮点数型
float
单精度,32位
默认值是0.0f
double
双精度,64位
默认值是0.0d
1.3 布尔型
boolean
只表示一位的信息
只有两个取值:true,false
默认值是false
1.4 字符型
char
单一的 16 位 Unicode 字符
最小值是 \u0000(即为0),
最大值是 \uffff(即为65,535 , 即2^16)
可以储存任意的字符,例如 char ch = 'A'
2.引用数据类型
在Java中,引用数据类型类似于C语言中的指针,引用数据类型指向一个对象,那么指向对象的变量就是引用变量,这些变量在声明时被指定为了一个特定的类型,比如Animal,Person等。变量一旦声明后,类型不可更改。
对象与数组都同属于引用数据类型。
所有的引用数据类型的默认值都是null。
一个引用变量可以用来引用任何与之兼容的类型。(这句话摘自菜鸟教程,我始终没弄清含义,只有简单的一个例子:Person person = new Person("name");)
3.包装类
基本数据类型不是对象,所以不能使用类的方法;因此Java针对基本数据类型提供了它们所对应的包装类,八大基本数据类型对应类八种包装类,以引用数据类型的方式来调用。
包装类位于java.lang的包下:
通过上图可以发现,从形式来说除了Integer和Character,与之对应的包装类都是首字母大写。
3.1 拆箱与装箱
装箱:基本类型-->包装类型(或者叫对象类型,引用类型)
拆箱:包装类型-->基本类型
在jdk5.0之前,拆装箱都是手动完成的,装箱通过包装类.valueOf()方法
拆箱使用包装类.intValue()方法。
这边使用了Integer和Double举例,在Integer里有个“128陷阱”,看如下代码:
这段代码的运行结果是什么样?按照正常的思维模式来说,他们的返回应该都为true,但是如果按照java一般都是值传递来说,他们应该都是false,总之,这两次比较的结果应该是一样的。
但是实际的返回是这样的:
第一次是false,第二次是true。这是为什么呢?
我们可以点进Integer.valueOf()方法里看一下
可以看到,当传一个int类型的值时,会先去比较IntegerCache.low 与 IntegerCache.high,如果值在两者之间,那么就不会新创建一个对象,而是从cache数组中直接取值。说到这里应该可以明白IntegerCache.high的值了,
所以,可以得出一个结论,当int值在-127到127之间,自动装箱时是不会新创建对象,而是从一个cache数组中取一个对象出来,由于在java中, “==” 比较是地址,从数组中取出来的对象地址是一样的,而新创建的对象地址是互不相同的,最终导致了上述的情况。