对象包装器与自动装箱

  • 所有的基本类型都有一个与之对应的类,这些类称为包装器(Wrapper)。 这些包装器类名为:Integer,Long,Float,Double,Short,Byte,Character,Void,Boolean(前六个类派生于公共的父类Number)。对象的包装器类都是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时,对象包装器类还是final,因此不能定义它们的子类。包含在包装器中的值是不会改变的。
  • 由于每个值分别包装在对象中,所以ArrayList<Integer>的效率远远低于int[] 数组。
  • 自动装箱/拆箱
    • ArrayList<Integer> arl =new ArrayList<>(); 
    • arl.add(3);将自动变换成arl.add(Integer.valueOf(3));-----自动装箱,将基本类型赋给包装器类型。
    • int i=arl.get(n);自动转换为int i=arl.get(n).intValue();----自动拆箱,将包装器类型赋给基本类型。
    • 在算术表达式中也能够实现自动装箱/拆箱。
      • Integer i=9;   i++;
      • 编译器将自动插入一条拆箱指令,然后进行自增运算,最后再将结果装箱。
  • 包装器对象的比较使用equals()方法,不能使用==(==比较的是地址)。
  • 包装器类引用可以为null。
  • 如果在一个表达式中混合使用Integer , Double类型,Integer值会自动拆箱,提升为double,再装箱为Double。
        
         Integer integer=4;
         Integer integer2=4;
         Double double1=4.0;
         double d=4.0;
         
         System.out.println(double1==d);//包装器类型与基本类型
         System.out.println(new Integer(2)==new Integer(2));//通过构造函数
         System.out.println(integer==integer2);//通过自动装箱,且介于-128--127
         System.out.println(new Integer(4)==integer);//构造函数与自动装箱
         System.out.println(integer+double1);
输出结果为:
          
          true
          false
          true
          false
          8.0
  • 装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用,虚拟机只是执行这些字节码。
  • 包装类型与基本类型的比较
    • 包装类是引用类型,但可以直接用"=="跟基本类型比较
  • 包装类与包装类的比较
    • 如果包装类对象都是通过构造方法创建的:遵循对象的比较规则,即用"=="比较的是地址,用equals()比较对象的内容
    • 如果包装类对象都是通过自动装箱创建,且属于[-128,127],可以用"=="比较他们的值是否相等;如果在[-128,127]之外,那么遵循对象的比较规则
    • 如果两个对象分别通过自动装箱和构造方法创建的,不论是不是属于[-128,127],都遵循对象的比较规则。
  • 关于[-128,127]:
    • Integer类在初始化时,一个内部类的静态代码块将[-128,127]的每个整数都创建了Integer对象,并保存在一个数组中,今后在将[-128,127]中的一个整数自动装箱成Integer对象时,则直接指向这个数组中对应的对象,因此可以用"=="比较它们的值是否相等
    • 自动装箱规范要求boolean,byte,char<=127,介于-128--127之间的short和int被包装到固定的对象中。
  • 字符串型的值转为基本类型:
    • 用包装类的静态的parse...(String s)方法。注意没有Character类,String的toCharArray()方法转为字符数组
  • 字符串转包装器类型
    • 用包装类的构造器
    • 调用包装器类的valueOf(String s)
  • 基本类型转为字符串
    • 静态方法String.valueOf();
    • 基本变量+"";
public int  intValue()
int 类型返回该 Integer 的值。-----拆箱
public long  longValue()
long 类型返回该 Integer 的值
public static  Integer  valueOf(int i)
返回一个表示指定的 int 值的 Integer 实例。-----装箱
public static  Integer  valueOf( String s)
返回保存指定的 String 的值的 Integer 对象。
public static int  parseInt( String s)
将字符串参数作为有符号的十进制整数进行解析







































































  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值