目录
1.one == two 【false】 对象vs对象 判断【两个引用】(地址)是否一致 ,one和two都是100,但用了两个new就是申请了两个不同的地址.
2. 2.java为了提高执行效率,在valuof()方法执行的过程中,提供了一个类似常量数组的缓存区(对象池),当Integer four = 100,第二次使用valueof()执行的过程中,传入的参数在[-127,127]之间时,则直接使用缓存区中的值,不生成新的实例化对象,及three和four指向同一块内存,所以three == four;返回值为true,如果不在[-128,127]之间则会隐式的调用new来实例化一个Integer类型,所以five == six 返回值为false(开辟新的内存空间)
包装类的意义
包装类的意义:java中有8个基本类型,他们是以值的形式存在内存中,而不是对象。更不是object的子类,不能参与面向对象的开发。若想让基本类型参与面向对象的开发,就需要包装类。
包装类是不可变类,在构造了包装类对象后,不允许更改包装类在其中的值
包装类
每个基本数据类型都有对应的包装类
】
java中所有的包装类都存放在java.lang包中
java 中的包装类都是用final声明的,所以都不能被继承,且实现了Comparable方法,除了字符型和布尔型都继承至numberl类
基本数据类型和包装之间的关系:
装箱:基础数据类型转换为包装类;分为手动装箱和自动装箱
1.自动装箱:声明基础数据类型变量并赋值给声明的包装类变量;
2.手动装箱:实例化包装类,其构造方法传入基础数据类型变量;
拆箱:包装类转换为基础数据类型
1.自动拆箱:声明基础数据类型,将包装类变量赋值与其值;
2.手动拆箱:声明基础数据类型,通过包装类对象调用对应的value方法赋值给基础数据类型.
装箱:
拆箱:
例程:
// 定义int类型变量,值为100
int score = 100;
// 创建Integer包装类对象,表示变量score1的值
Integer score1 = new Integer(score);
// 将Integer包装类转换为double类型
double d = score1.doubleValue();
// 将Integer包装类转换为long类型
long l = score1.longValue();
// 将Integer包装类转换为int类型
int i = score1.intValue();
//打印输出
System.out.println(score);
System.out.println(score1);
System.out.println(d);
System.out.println(l);
System.out.println(i);
包装类的默认值
包装类也是一个类,所以包装类声明的对象默认值都为null
one == two 【false】 对象vs对象 判断【两个引用】(地址)是否一致 ,one和two都是100,但用了两个new就是申请了两个不同的地址。
three == 100;实际完成的是一个自动拆箱的操作,包装类对象three还原出来的100这个数值。
three == four;
valueof(()方法的[-128,127]缓存区:
Integer four = 100;装箱操作实际执行的是 Integer four = Integer.valueof(100);
1/valueof(),返回一个整数实例,该实例表示指定的整型值。如果不需要新的Integer实例,则通常应优先使用此方法,而不应使用构造函数Integer(int),使用构造方法回申请新的内存。
2.java为了提高执行效率,在valuof()方法执行的过程中,提供了一个类似常量数组的缓存区(对象池),当Integer four = 100,第二次使用valueof()执行的过程中,传入的参数在[-127,127]之间时,则直接使用缓存区中的值,不生成新的实例化对象,及three和four指向同一块内存,所以three == four;返回值为true,如果不在[-128,127]之间则会隐式的调用new来实例化一个Integer类型,所以five == six 返回值为false(开辟新的内存空间)
3.因为通过缓存频繁请求的值,此方法可能会显著提高空间和时间性能。此方法将始终缓存-128到127(包括)范围内的值,并且可能缓存此范围之外的其他值。
4. 简单总结就是[-128,127]之间的包装类对象使用 " =="比较返回值为true,范围外的一般都为false。
5. 除了float和double之外都可以使用常量池的概念,double 和 float 没有对象常量池。