对象包装器与自动装箱(Java的128陷阱)

有时, 需要将 int 这样的基本类型转换为对象。 所有的基本类型都冇一个与之对应的类。

例如,Integer 类对应基本类型 int。通常,这些类称为包装器 ( wrapper ) 这些对象包装器类拥有很明显的名字:Integer、Long、Float、Double、Short、Byte、Character 、Void 和 Boolean (前6 个类派生于公共的超类 Number)。对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。同时, 对象包装器类还是 final , 因此不能定义它们的子类。

假设想定义一个整型数组列表。而尖括号中的类型参数不允许是基本类型,也就是说,不允许写成 ArrayList<int>。这里就用到了 Integer 对象包装器类。我们可以声明一个 Integer对象的数组列表。

ArrayList<Integer> list = new ArrayList<>();

幸运的是, 有一个很有用的特性, 从而更加便于添加 int 类型的元素到 ArrayLis<lnteger>中。下面这个调用

list.add(3);

将自动地变换成

list.add (Integer.value0f(3));

这种变换被称为自动装箱(autoboxing)。

要注意:自动装箱规范要求 boolean、byte、char 127, 介于 -128 ~ 127 之间的 short 和int 被包装到固定的对象中。例如,如果在前面的例子中将 a 和 b 初始化为 100,对它们进行比较的结果一定成立。

public static void main(String[] args) throws Exception{
    Integer a = 127;
    Integer b = 127;

	Integer a1 = 128;
	Integer b1 = 128;

	System.out.println(a == b);		//true
	System.out.println(a1 == b1);	    //false
}

最后强调一下,装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时, 插人必要的方法调用。虚拟机只是执行这些字节码。

int intValue( )

以 int 的形式返回 Integer 对象的值(在 Number 类中覆盖了 intValue方法)。

下面是Integer类的常用方法:

static String toString(int i ) 以一个新 String 对象的形式返回给定数值 i 的十进制表示。
static String toString(int i ,int radix ) 返回数值 i 的基于给定 radix 参数进制的表示。

static int parselnt(String s)

static int parseInt(String s,int radix)

返回字符串 s 表示的整型数值, 给定字符串表示的是十进制的整数(第一种方法,)

或者是 radix 参数进制的整数(第二种方法 。)

static Integer valueOf(String s)

Static Integer value Of(String s, int radix)

返回用 s 表示的整型数值进行初始化后的一个新 Integer 对象, 给定字符串表示的是十

进制的整数(第一种方法,)或者是 radix 参数进制的整数(第二种方法。)

Number parse(String s)

返回数字值,假设给定的 String 表示了一个数值。

public static void main(String[] args) throws Exception{
	Integer a = 127;
	int a1 = a.intValue();
	System.out.println(a1);		//127

	int b = 126;
	String b1 = Integer.toString(b);
	String b2 = Integer.toString(b,16);
	System.out.println(b1);		//126
	System.out.println(b2);		//7e

	String c = "126";
	int c1 = Integer.parseInt(c);
	int c2 = Integer.parseInt(c,8);
	System.out.println(c1);		//126	
	System.out.println(c2);		//86

	String d = "127";
	Integer d1 = Integer.valueOf(d);
	Integer d2 = Integer.valueOf(d);
	System.out.println(d1);		//127
	System.out.println(d2);		//127
}

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_36186690/article/details/81172216