所有的基本类型都有一个与之对应的类,这些类称为包装器(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)
将字符串参数作为有符号的十进制整数进行解析
转载请注明原文地址: https://ju.6miu.com/read-650058.html