Java包装类(直戳本质)
2021/11/9 17:12:02
本文主要是介绍Java包装类(直戳本质),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
为什么需要包装类
JAVA是面向对象的语言,很多类和方法中的参数都需要使用对象(例如:集合),但基本类型数据却不是面向对象的,造成了很多不便。
包装类,顾名思义,是将基本类型"包装起来",使其具备对象的特质,包括可以添加属性和方法,位于 java . lang
包下。
装箱and拆箱:
拆箱和装箱
将基本数据类型转化为对应类型的包装类的过程叫"装箱";
将包装类转为对应类型的基本数据类型的过程叫做"拆箱"。
public static void main(String[] args) { Integer a = 0; for(int i = 0; i < 100; i++){ a += i; } }
上面中给变量a赋值的时候发生了装箱,而在参与计算的过程中就发生了拆箱,但是又好像什么也没做,这是自动拆箱。
装箱过程AND拆箱过程
int num1 = 25; Integer i = Integer.valueOf(num1);//装箱 Integer j = 10; int num2 = j.intValue(); //拆箱
装箱是通过调用包装器类的 valueOf
方法实现的
拆箱是通过调用包装器类的 xxxvalueOf
方法实现的,xxx代表对应的基本数据类型。例如: int
装箱的时候自动调用Integer
的 valueOf(int)
方法; Integer
拆箱的时候自动调用Integer
的intValue
方法。
自动装箱 AND自动拆箱
Java 为了简便拆箱与装箱的操作,提供了自动拆装箱的功能
int t1 = 2; Integer t2 = t1;//自动装箱 int t3 = t2;//自动拆箱
自动装箱都是通过包装类的valueOf()
方法来实现的.自动拆箱都是通过包装类对象的xxxValue()
来实现的。
什么时候会自动拆装箱(示例代码中解释了装箱或者拆箱的过程)
-
将基本数据类型放入集合类
List<Integer> li = new ArrayList<>(); for (int i = ; i < 50; i ++){ li.add(i); List<Integer> li = new ArrayList<>(); for (int i = 1; i < 50; i += 2){ li.add(Integer.valueOf(i)); }
-
包装类型和基本类型的大小比较
Integer a=1; System.out.println(a==1?"等于":"不等于"); Boolean bool=false; System.out.println(bool?"真":"假") Integer a=1; System.out.println(a.intValue()==1?"等于":"不等于"); Boolean bool=false; System.out.println(bool.booleanValue?"真":"假");
-
包装类型的运算
Integer 四则运算
Integer i = 10; Integer j = 20; System.out.println(i+j) Integer i = Integer.valueOf(10); Integer j = Integer.valueOf(20); System.out.println(i.intValue() + j.intValue());
-
三目运算符的使用
boolean flag = true; Integer i = 0; int j = 1; int k = flag ? i : j; boolean flag = true; Integer i = Integer.valueOf(0); int j = 1; int k = flag ? i.intValue() : j;
-
函数参数与返回值
//自动拆箱 public int getNum1(Integer num) { return num; } //自动装箱 public Integer getNum2(int num) { return num; }
自动拆箱与缓存
Integer integer1 = 3; Integer integer2 = 3; System.out.println(integer1 == integer2);//ture Integer integer3 = 300; Integer integer4 = 300; System.out.println(integer3 == integer4);//false
在Java中,==比较的是对象应用。但是在这个例子中,真正的结果是ture,false。
原因就和 Integer中的缓存机制有关。在Integer的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用。
适用于整数值区间-128 至 +127。 只适用于自动装箱。使用构造函数创建对象不适用。
当需要进行自动装箱时,如果数字在-128至127之间时,会直接使用缓存中的对象,而不是重新创建一个对象。
包装类
用途:
-
集合不允许存放基本数据类型,故常用包装类。
-
包含了每种基本类型的相关属性,例如:最大值,最小值,所占位数等。
-
作为基本数据类型对应的类的类型,提供了一系列实用的对象操作,例如:类型转换,进制转换等。
基本类型与包装类型的区别:
-
八大基本类型不是对象。
-
声明方式的不同。基本类型无需用new关键字来创建,封装类却需要用new关键字创建。
-
存储方式及位置的不同。基本类型是直接存储变量的值保存在堆栈中能高效的存取,包装类需要通过引用指向实例,具体的实例保存在堆中。
-
初始值的不同。包装类型的初始值为null,基本类型的初始值是具体的类型而定的,例如:
int
初始值为0,boolean
为false -
使用的方式不同。例如: 与集合类合作使用时只能使用包装类型。
-
什么时候改用包装类,什么时候用基本类型,看基本的业务来定:这字段允许null值,就需要用包装类型;如果不允许null,使用基本类型就可以;用到泛型和反射用函数,就需要用包装类。
int i = 128; Integer i2 = 128; Integer i3 = new Integer(128); System.out.println(i == i2); //Integer会自动拆箱为int,所以为true System.out.println(i == i3); //true,理由同上 Integer i4 = 127; //编译时被翻译成:Integer i4 = Integer.valueOf(127); Integer i5 = 127; System.out.println(i4 == i5); //true 缓存(-128-127)在范围内,true Integer i6 = 128; Integer i7 = 128; System.out.println(i6 == i7); //false 缓存(-128-127)不在范围内,false Integer i8 = new Integer(127); System.out.println(i5 == i8); //false 地址不同 Integer i9 = new Integer(128); Integer i10 = new Integer(123); System.out.println(i9 == i10); //false
总结:
-
无论如何,Integer 与 new Integer不会相等。不会经历拆箱过程,new出来的对象存放在堆,而非new的Integer常量则在常量池(方法区),他们的内存地址是不一样的,所有为false。
-
两个都是非new出来的Integer ,如果数在-128-127之间,为true,否则为false。
-
两个new出来的,都为false。内存地址不一样。
-
int
和Integer(无论new不new)比,都为true,因为会把Integer自动拆箱成int
去比。
基本类型的包装类
Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail
BigInteger、BigDecimal
没有相对应的基本类型,主要应用于高精度的运算。
BigInteger
支持任意精度的整数,BigDecimal
支持任意精度带小数点的运算。
这篇关于Java包装类(直戳本质)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-28MQ底层原理资料详解:新手入门教程
- 2024-11-28MQ项目开发资料详解:新手入门教程
- 2024-11-28MQ项目开发资料详解:入门与初级用户指南
- 2024-11-28MQ消息队列资料入门教程
- 2024-11-28MQ消息队列资料:新手入门详解
- 2024-11-28MQ消息中间件资料详解与应用教程
- 2024-11-28MQ消息中间件资料入门教程
- 2024-11-28MQ源码资料详解与入门教程
- 2024-11-28MQ源码资料入门教程
- 2024-11-28RocketMQ底层原理资料详解