认识Java的整形数据结构
摘要:java中一切都是对象,为什么int不用创建对象实例化,而可以直接使用?
本文分享自华为云社区《【Java】对基本类型-整型数据结构的认识》,作者: huahua.Dr 。
整型数据类型有两个:基本类型和引用类型(包装类)
整数型基本类型:byte,int,short,long
其引用类型:Byte,Integer,Short,Long
他们之前主要的区别在于:
- 存储占用的空间不同,分别是1,2,4,8个字节(每个字节占用8bit),
- java里面整数型默认使用的int数据类型,即如果直接写整数字面量时,它表示的就是int类型,
- 整数型数据类型之间可以相互转换,以int为默认中间类型,定义了一个整数值4,可以直接赋值给int,
- 也可以直接赋值给short和byte(只要数值范围不超过byte和short的存储范围,可以自动向下转型为byte或者short;如果超过则需要强转但超过的高位数会丢失),也可以直接赋值给long,不需要强转,会自动向上转型。
- long数据类型可以直接使用L或l声明
- 他们之间可以直接转,只要数值范围大于等于它的数值范围,都可以直接转;如果小于它的数值范围就需要强转,但强转会导致数值丢失,编译并不会报错。
其他的基本相同;因此我们以int类型来展开详细说明。
java中一切都是对象,为什么int不用创建对象实例化,而可以直接使用?
单纯是为了编程方便,引入基本类型。
既然引入了基本对象,那也不能破坏java是一个操作对象的语言吧?
所以后面引入了包装类(wrapper class),为每种基本类型都引入了其对应的包装类型,int基本类型的包装类型就是Integer对象。
基本类型引入了包装类型就能将,int基本类型就能像操作对象一样去操作了吗?
是的,还Java1.55引入了一个机制:自动拆箱和自动装箱,使得基本类型和其对应的包装类型可以相互转换,原始基本类型可以自动转换成对应的包装对象。
基本类型和包装类型是何时进行相互转化,如何相互转换?
自动拆箱与装箱机制,可以在java变量赋值或者方法调用传值与返回值或者容器存储数据时直接使用基本类型或者对应的包装类型;在java 1.5版本之前,使用容器集合(Collection)存储数据时,只能存储引用类型,需要存储基本类型,则需要先将其转成其对应的包装类型才可以。
自动装箱就是java自动的将基本类型数值转换成其对应的包装类型,自动装箱时编译器会自动调用其包装类的valueOf()方法将基本类型数值转成对象。
自动拆箱就是java自动将包装类型转换成其对应的基本类型,自动拆箱时编译器会自动调用其包装类的xxxValue()方法:如intValue()doubleValue()longValue()等将对象转成基本类型数值。
当基本数据数值与包装类型进行运算时,会触发自动拆箱。
例子:
//before autoboxing Integer iObject = Integer.valueOf(3); Int iPrimitive = iObject.intValue() //after java5 Integer iObject = 3; //autobxing - primitive to wrapper conversion int iPrimitive = iObject; //unboxing - object to primitive conversion public static Integer show(Integer iParam){ System.out.println("autoboxing example - method invocation i: " + iParam); return iParam; } //autoboxing and unboxing in method invocation show(3); //autoboxing int result = show(3); //unboxing because return type of method is Integer