包装类(Integer)自动拆装箱 valueOf()和intValue()

包装类(封装类)

  • byte - Byte    short - Short    int - Integer    long- Long 
       float - Float   double-Double char - Character  boolean-Boolean
       (1)类所在的包:八个包装类都在同一个包下,java.long包,不需要import导包,可以直接使用;
       (2)类的关系:八个包装类中有六个是与数字相关的,前六个,都默认继承Number类;
       (3)八个包装类都实现了Serializable,Comparable;
       (4)是否可以创建对象:八个包装类都有带自己参数的构造方法;
        八个包装类中有七个(除了Caracter)含有构造方法重载 带String类型;
       (5)类中提供的常用方法:
         有六个与数字有关的类都集成Number,里面有一个方法:xxxvalue(),将一个包装类类型转化成对应的基本类型;xxx对应int、short、byte、long、float、double;
       (6)笔试中常见的题目:
        Integer i1 = 10;
        Integer i2 = 10;
        int i5 = 10;
        Integer i3 = new Integer(10);
        Integer i4 = new Integer(10);
        System.out.println(i1 == i5);		//true
        System.out.println(i3 == i5);		//true
        System.out.println(i1 == i2);       //true
        System.out.println(i1 == i3);       //false
        System.out.println(i3 == i4);       //fasle
        System.out.println(i1.equals(i2));  //true
        System.out.println(i1.equals(i3));  //true
        System.out.println(i3.equals(i4));  //true

(1)= =与equals()的区别
   = = 可以比较基本数据类型,也可以比较引用数据类型(变量中存储的内容);
   如果比较的是基本数据类型,那么比较的是变量中存储的值;
   如果比较的是引用数据类型,那么比较的是变量中存储的地址引用;
   equals()是Object类中继承过来的方法,每一个引用类型都可以调用;
   默认继承过来的equals()比较方法和 == 一致,如果想要改变比较规则,可以重写;
   由于Integer类重写了equals(),所以Integer比较的是数值;
(2)Integer类加载的时候,自己有一个静态空间
  加载Integer类的时候立即加载了一个Integer类型的数组 ,里面存储256个Integer对象,从-128 ~ 127;
  如果我们用的对象范围是在这个之间,那么直接会从静态区去找这个对象;
  如果我们用的对象超出了这个范围,那么会默认帮我们创建(new)一个Integer对象;
  下面是这段代码的内存图
在这里插入图片描述

  • 自动拆装箱
int i = 1;//自动拆箱 之后会自动执行Integer i = i.intValue();
Integer j = 2;//自动装箱 相当于执行一行代码  Integer j = Integer.valueOf(2);

那么现在我们来看一下源码 valueOf()

			
public static Integer valueOf(int i) {
        //IntegerCache.low == -128,IntegerCache.high == 127
        if (i >= IntegerCache.low && i <= IntegerCache.high)
        //如果传进来的i是1,属于这个范围,那么就会返回 cache[1+128] = 1
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}
//下面这段是cache数组的源码,可以看出 cache[0]=-128,所以cache[129]=1
cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
    

下面代码是intValue()的源码

    public int intValue() {
        return value;
    }

猜你喜欢

转载自blog.csdn.net/qq_40791843/article/details/91876097