Version: Next

包装类

装箱与拆箱

  • 装箱:
    • 构造方法
      • Integer(int value)
      • Integer(String s)
    • 静态方法:
      • static Integer valueOf(int i)
  • 拆箱:
    • 成员方法:int intValue()
@Test
public void testInteger() {
Integer value = new Integer(11);
Integer valueString = new Integer("12");
Integer valueStatic = Integer.valueOf(13);
System.out.println(value);
System.out.println(valueString);
System.out.println(valueStatic);
//拆箱
int intValue = value.intValue();
System.out.println(intValue);
}

自动装箱、拆箱

自动装箱与自动拆箱: Since JDK 1.5,基本类型的数据和包装类之间可以自动的相互转换

/***
* 自动拆箱与自动装箱
* 自动装箱:直接将int类型的整数赋值给包装类
* 自动拆箱:包装类无法直接参与运算,自动转化为基本数据类型在进行计算,算完的结果再自动装箱
*/
@Test
public void testAutoWarp() {
//自动装箱
Integer in = 1;
//自动拆箱
in = in + 2;
//ArrayList无法存储基本类型,但是可以存储包装类
ArrayList<Integer> list = new ArrayList<>();
//int -> Integer --> 自动装箱
list.add(2);
//自动拆箱,Integer -> int
int a = list.get(0);
}

基本类型与字符串之间的相互转化

  • 基本类型 -> 字符串

    1. 基本类型的值+""
    2. 包装类的静态方法toString(参数)
    3. String类的静态方法,valueOf(参数)
  • 字符串 -> 基本类型

    • 使用包装类的静态方法parseXxxx(“数值类型的字符串”)

    • Integer.parseInt("12");

@Test
public void testStringTransferBasicType() {
int i1 = 100;
String s1 = i1 + "";
String string = Integer.toString(11);
String s = String.valueOf(13);
//100200
System.out.println(s1 + 200);
System.out.println(string + 200);
System.out.println(s + 200);
System.out.println("-----------------------------------------");
int i = Integer.parseInt("123");
System.out.println(i - 10);
}
100200
11200
13200
-----------------------------------------
113

缓冲池(Cache)

阿里巴巴编程规范:比较相同类型的包装类对象之间值,使用 equals 方法,而不是==

包装类对象原本是引用对象,若使用 == 只是比较两个引用变量是否指向相同的对象。在JDK1.5之后有了自动装箱、拆箱。对于 Integer 对象来说,初始值在-128 ~ 127时会将对象放入缓存池(IntegerCache.cache),下次调用相同的值将直接复用,在该区间的Integer 对象可直接进行判读

该区间以外的对象在 Heap 上产生,不会进行复用。所以推荐使用 equals 方法进行判断。

Integer a = 1;
Integer b = 1;
// 输出 ture
System.out.println(a == b);
Integer c = 123;
Integer d = 123;
// 输入 true
System.out.println(c == d);
Integer e = 129;
Integer f = 129;
// 输入 false
重要
  • Integer包装类有IntegerCache用于缓存Integer对象,固定范围是 -128 ~ 127

  • Byte 包装类有 ByteCache 用于缓存 Byte 对象,固定范围是 -128 ~ 127

  • Short 包装类有 ShortCache 用于缓存 Short 对象,固定范围是 -128 ~ 127

  • Long 包装类有 LongCache 用于缓存 Long 对象,固定范围是 -128 ~ 127

  • Character 包装类有 CharacterCache 用于缓存 Character 对象,固定范围是 0 ~ 127

  • 除了 IntegerCache 其他包装类的缓存机制均不可以改变范围。

具体可看对应包装类源码中的valueOf()方法