Skip to content

Latest commit

 

History

History
60 lines (52 loc) · 1.78 KB

数据类型.md

File metadata and controls

60 lines (52 loc) · 1.78 KB

1.基本类型和引用类型

Java 数据类型分两种:

  • 基本类型:boolean, byte, char, short, int, long, float, double;
  • 引用类型:所有 classinterface 类型,如 StringMap

其中引用类型可以赋值为 null,基本类型不可以:

String string = null;
int anInt = null;  // Incompatible types

想要把基本类型变成引用类型?这就引出了包装类:

基本类型 包装类
boolean Boolean
byte Byte
char Character
short Short
int Integer
long Long
float Float
double Double

2.开箱和装箱

Java编译器会自动将基本类型和包装类型转型:

Integer n = 10;  // 自动装箱 Integer.valueOf(10)
int m = n;  // 自动开箱 Integer.intValue(n)

所有的包装类型都是不变类,一旦创建对象,该对象就是不变的。

Integer 的 valueOf 方法用到了内部类 IntegerCache,这里面创建了数值 -128-127 的对象池,对性能有提升。

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

下面一个特别好的例子来说明包装类和基本类型的异同:

Integer i1 = 40;
Integer i2 = 40;
Integer i3 = 0;
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
Integer i6 = new Integer(0);
Integer i7 = 250;
Integer i8 = 250;

i1 == i2  // true,均引用同一个对象
i1 == i2 + i3  // true
i4 == i5  // false,两个Integer对象
i4.equals(i5)  // true,用equals比较引用类型
i4 == i5 + i6  // true,运算过程中自动开箱
i7 == i8  // false,数值超出常量池范围,相当于new两个Integer对象