27java的包装类&自动装箱&自动拆箱&缓存问题

包装类

在这里插入图片描述

下面是包装类的使用方法:

package oop.OopDemo.WrapClass;

/**
 * 测试包装类的基本用法
 *
 * @author 发达的范
 * @date 2020/10/24
 */
public class Test01 {
    
    
    public static void main(String[] args) {
    
    
        //报错:Cannot resolve constructor 'Integer()',必须传递一个整形数据被包装
        //Integer integer = new Integer();
        //包装类,把1000这个数包装成一个Integer类的对象,把这个值作为属性包装成一个对象
        Integer i = new Integer(1000);
        System.out.println(i.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
        System.out.println(i.toHexString(i));
        System.out.println(Integer.toHexString(i));
        //把字符串转换成数字
        Integer i2 = Integer.parseInt("123");
        System.out.println(i2+1);
        Integer i3 = new Integer("456");
        System.out.println(i3.intValue());
        System.out.println(i.intValue());
        //加上一个字符串把数字变成字符串
        String string = 123 + "";
    }
}

运行结果:在这里插入图片描述

这是Integer的父类,它的父类由继承了Numbers:

public final class Integer extends Number implements Comparable<Integer> 

Numbers 是一个抽象类:

public abstract class Number implements java.io.Serializable

这是抽象类Numbers的继承树:
在这里插入图片描述

可见:八大基本数据类型都有对应的包装类,且这些包装类都是继承Numbers类,所以它们都有Numbers类的方法的普通属性。

目前来说,由于学习接触的内容比较少,我感觉把基本数据类型包装成对象来使用用处好像不是很大,下面是包装类的作用:

在这里插入图片描述


自动装箱&自动拆箱&缓存问题

接着上面的包装类,可以把基本数据类型包装成对象来调用包装类的方法,接着JDK 的开发人员为了提高开发人员开发效率,提出了自动装箱和自动拆箱的概念,下面以代码作为说明:

package oop.oopdemo.wrapclass;

/**
 * 测试自动装箱、自动拆箱和缓存问题
 *
 * @author 发达的范
 * @date 2020/10/24
 */
public class Test02 {
    
    
    public static void main(String[] args) {
    
    
        //包装类
        Integer a = new Integer(1000);
        /*
        自动装箱,正常情况下,把基本数据类型赋值给对象是应该报错的,但是此处是包装类的自动装箱操作,也即是编译器把代码变成了
        Integer b = new Integer(2000);,编译器自动把整形数据包装成一个对象
        */
        Integer b = 2000;
        System.out.println(b.intValue());
        //正常情况下,把一个对象赋值给整形数据也应该报错,但是这里编译器自动惊醒拆箱操作,也就是int c = b.intValue();
        int c = b;
        System.out.println(c);
        //为了验证编译器进行了自动拆箱操作,做下面的测试
        Integer d = null;
        //调用d.intValue()方法,但是d是null,所以无法调用Integer类的方法
        int e = d;
        //Exception in thread "main" java.lang.NullPointerException
        System.out.println(e);
    }
}

运行结果:在这里插入图片描述

public class Test02 {
    
    
    public static void main(String[] args) {
    
    
		Integer f = 2333;
        Integer g = 2333;
        System.out.println(f == g);
        System.out.println(f.equals(g));
        System.out.println("==========");
        Integer h = -123;
        Integer i = -123;
        System.out.println(h == i);
        System.out.println(h.equals(i));
        System.out.println("=============");
        Integer integer1 = new Integer(-123);
        Integer integer2 = new Integer(-123);
        System.out.println(integer1==integer2);
        System.out.println(integer1.equals(integer2));
    }
}

运行结果:在这里插入图片描述

从运行结果中发现一个问题:明明都是自动装箱,使用相同的方法输出,但是结果却不一样。

经测试:

  • 如果使用自动装箱,且被装箱的int型数值处于[-128,127]之间,编译器仍会把自动装箱后的对象当做基本数据类型进行处理,目的是提高运行效率
  • 如果不使用自动装箱,直接对int型数值进行包装,那么此时无论int型数值是多大都会被包装成一个对象,多以就出现了上述的结果。

自学java,请多多指教!

猜你喜欢

转载自blog.csdn.net/fada_is_in_the_way/article/details/109257123