Java数据类型(个人观点,若有不足,敬请指出)
1—基本数据类型大小
byte 1字节
short 2字节
int 4字节
long 8字节
float 4字节
double 8字节
char 2字节
boolean 1字节
2—数据类型的转换
数据类型之间会出现转换的情况,一种转换成另一种会出现精度损失的情况:(1)一个大数值转成一个小数值,就可能出现大数值的值大于小数值数据类型的最大数值,就可能出现丢失精度;(2)浮点类型转整数类型会自动剪掉后面的小数点后面的数值。虽然这些转换是不安全的,但是Java允许这种转换——强制类型转换。
在数值进行运算中,如果二个数值类型不同,先要转换成同一种才能进行计算。只要有一个double类型,其余就转换成double类型;然后就是float;然后是long;否则,那个多个操作数计算自动转换成int。
3—基本数据对象包装类
包装类存在的意义是为了方便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和行为丰富了该数据的操作。用于描述该对象的类就称为基本数据类型对象包装类。
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
因为是对象,所以所有包装类默认值是null
自动拆箱,自动装箱:就是对象类型和基本数据类型自动转换,如 Integer i = 3;int i2 = i;
拆箱实现:自动将基本数据类型转换为包装器类型;装箱过程是通过调用包装器的valueOf方法实现的
装箱实现:自动将包装器类型转换为基本数据类型。拆箱过程是通过调用包装器的xxxValue方法实现的。(xxx代表对应的基本数据类型)。
基本数据包装类与常量池技术
这个是非常有意思的一个点,基本数据包装类也运用了常量池技术,下面是Integer源码的拆箱方法
public static Integer valueOf(int i) {
//当我们传入的数值i>=IntegerCache.low=-128并小于IntegerCache.high(默认是127,可以调整大小)
if (i >= IntegerCache.low && i <= IntegerCache.high)
//从IntegerCache中取,这个类使用了常量池技术。
return IntegerCache.cache[i + (-IntegerCache.low)];
//若不再-128~127之间返回一个新对象
return new Integer(i);
}
由以上源码可知,当一个包装类在允许的取值范围里,如Integer在-128~127取值时,他通过valueof返回的是常量池的对象。所以当二个范围内对象==比较时,他们是ture地址相同的。
我的代码
Integer k = 1300;
Integer k1 = 1300;
int k2 = 1300;
Integer k3 = 12;
Integer k4 = 12;
Integer k5 = new Integer(12);
Integer k6 = new Integer(4)+new Integer(8);
Short a = 1200;
short b = 1300;
System.out.println(k==k1);flase-不在取值范围内。
System.out.println(k==k2);ture-拆箱机制,k会装换成基本数据类型比较大小。
//System.out.println(k==a);报错-不同“对象类型”无法比较。
System.out.println(k==b);ture-拆箱,不同数据类型直接比较值大小。
System.out.println(k3==k4);ture-在取值范围内返回常量池同一对象
System.out.println(k3==k5);flase-一个是堆一个是常量池。
System.out.println(k3==k6);ture-k6也调用了intvalue方法,也是常量池对象。
注意:
包装类中Double,Float返回的是新对象,没有使用常量池技术,源码如下
public static Float valueOf(float f) {
return new Float(f);
}
public static Double valueOf(double d) {
return new Double(d);
}
boolean返回简单,所有ture和flase都是同一个对象,就连他的返回对象在源码中都是用的static final修饰的。
public static final Boolean TRUE =new Boolean(true);
public static final Boolean FALSE =new Boolean(false);
public static Boolean valueOf(booleanb) {
return (b ?TRUE : FALSE);
}
包装类取值范围
Integer 相同对象范围 [-128,127]
Short 相同对象范围 [-128,127]
Byte 相同对象范围 [-128,127]
Character 相同对象范围 [0,127] char没有负数
Long 相同对象范围 [-128,127]
包装类的queals()方法
所有包装类都重写了equals()方法,比较值的大小。