包装类

308 阅读4分钟

基本类型除了int的integer和char的character,其他包装类都是开头大写;

Int与integer对比

int 是基本数据类型,Integer 是一个类,是int的扩展,定义了很多的转换方法

Integer是int的包装类;int是基本数据类型;

Integer变量必须实例化后才能使用;int变量不需要;

Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;

Integer的默认值是null;int的默认值是0。

在Integer类中,“==”用来比较对象地址是否相同,并且Integer类重写了equals(Object obj)方法,

在equals(Object obj)方法中,会先判断参数中的对象obj是否是Integer类型的对象,

如果是则判断值是否相同,值相同则返回true,值不同则返回false,如果obj不是Integer类的对象,则返回false。

需要注意的是:当参数是基本类型int时,编译器会给int自动装箱成Integer类,然后再进行比较。

这个区别要注意实践
在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,
而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。
int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,
int则无法表达出未赋值的情况。要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer

包装类作用

1. 为了在各种类型间转化,通过各种方法的调用;

除了char的包装类character,所有的包装类都有valueof(string s)方法和parsexxx(string s)方法;

这俩方法都是静态方法,所以使用时包装类名.方法就可以用;

1valueof(string s,基本类型)将字符串和基本数据类型转换为包装类

2parsexxx(string s)将字符串转换为基本数据类型;

总结  :

包装类的有参构造和valueof()都可以将基本类型和字符串转换为包装类

所有的包装类都重写了tostring方法,返回字符串;  Integer.toString(int i)

2. 在集合中存放基本数据类型(集合不存放基本数据类型);

类型转换常用方法

String类型的数字转换为int : Integer.parseInt(String s)

int类型转换为String     :  Integer.toString(int i)  string.valueof(int i)

string的valueof()可以将基本类型转换为字符串;

integer特性

1自动装箱和拆箱;

自动装箱:将基本数据类型重新转化为对象

            // 声明一个Integer对象,用到了自动的装箱:解析为:Integer num = Integer.valueOf(9);

        Integer num = 9;

自动拆箱:将对象重新转化为基本数据类型

对于整数,javac替我们自动把装箱转换为Integer.valueOf(),把拆箱替换为Integer.intValue()。

哪些地方会自动拆装箱:

场景一、将基本数据类型放入集合类

场景二、包装类型和基本类型的大小比较

场景三、包装类型的运算

场景四、三目运算符的使用

场景五、函数参数与返回值

由于自动拆箱,如果包装类对象为null,那么自动拆箱时就有可能抛出NPE。

2、值缓存(string也有值缓存)

Integer i1 = 1;

Integer i2 = Integer.valueOf(2);

Integer i3 = new Integer(3);

上述代码中第一行与第二行的写法取值使用了值缓存,而第三行的写法则没有利用值缓存。

Integer的缓存机制: Integer是对小数据(-128~127)是有缓存的,

jvm初始化的时候,数据-128~127之间的数字便被缓存到了本地内存中。

定义Integer变量的过程

定义一个Integer变量时,会默认进行Integer.valueOf(a)操作;

valueOf()在返回之前,会进行判断,判断当前 i的值是否在 -128到127之间。

如果存在,则直接返回引用,不再重新开辟内存空间。

如果不存在,创建一个新的对象。利用缓存,这样做既能提高程序执行效率,还能节约内存。

eg:

Integer i1 = 20; Integer i2 = 20; 因为 IntegerCache中已经存在此对象,直接返回引用,引用相等并且都指向缓存中的数据,所以这时候i1 == i2返回true。

Integer i1 = 200; Integer i2 = 200;因为i1,i2的值大于127,不在[-128, 127]范围内,所以虚拟机会在堆中重新new一个 Integer对象来存放200,创建两个对象就会产生两个这样的空间。

如果初始化-128~127之间的数字,会直接从内存中取出,不需要新建一个对象.

仅仅是Integer,Java也为其它包装类提供了值缓存机制,包括Boolean、Byte、Short和Character等。

但与String不同的是,默认都只会将绝对值较小的值放入缓存。