1、包装类和基本数据类型的关系
基本数据类型
|
包装类
|
byte
|
Byte
|
boolean
|
Boolean
|
short
|
Short
|
char
|
Character
|
int
|
Integer
|
long
|
Long
|
float
|
Float
|
double
|
Double
|
2、继承关系
3、包装类的创建
Integer i = new Integer(1);
4、包装类的自动装箱和拆箱机制
Integer i = new Integer(1);
int j = i.intValue();
public class Test { public static void main(String[] args) { Integer i = 1; //自动装箱 int j = i; //自动拆箱 System.out.println(i + "," + j); } }
public class Test { public static void main(String[] paramArrayOfString) { Integer integer = Integer.valueOf(1); int i = integer.intValue(); System.out.println(integer + "," + i); } }
可以看到,JAVA的编译器自动帮我们完成了装箱和拆箱的操作
5、包装类中的缓存机制
public class Test { public static void main(String[] args) { Integer i1 = 100; Integer i2 = 100; Integer i3 = new Integer(127); Integer i4 = new Integer(127); Integer i5 = 200; Integer i6 = 200; System.out.println(i1.equals(i2)); //1、true System.out.println(i1 == i2); //2、true System.out.println(i3.equals(i4)); //3、true System.out.println(i3 == i4); //4、false System.out.println(i5.equals(i6)); //5、true System.out.println(i5 == i6); //6、false } }
public class Test { public static void main(String[] paramArrayOfString) { Integer integer1 = Integer.valueOf(100); Integer integer2 = Integer.valueOf(100); Integer integer3 = new Integer(127); Integer integer4 = new Integer(127); Integer integer5 = Integer.valueOf(200); Integer integer6 = Integer.valueOf(200); System.out.println(integer1.equals(integer2)); System.out.println((integer1 == integer2)); System.out.println(integer3.equals(integer4)); System.out.println((integer3 == integer4)); System.out.println(integer5.equals(integer6)); System.out.println((integer5 == integer6)); } }
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} }
- 当valueOf()的参数值i在[-128,128)之间时,返回的是IntegerCache.cache[i+128]
- 当i >= 128 || i < -128 =====> new Integer(i)
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; } public int intValue() { return value; }
public static void main(String[] args) { Double i1 = 100.0; Double i2 = 100.0; Double i3 = 200.0; Double i4 = 200.0; System.out.println(i1==i2); //false System.out.println(i1.equals(i2)); //true System.out.println(i3==i4); //false System.out.println(i3.equals(i4)); //true }
public static Double valueOf(double d) { return new Double(d); }
- Integer派别:Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。
- Double派别:Double、Float的valueOf方法的实现是类似的。每次都返回不同的对象。
public class Main { public static void main(String[] args) { Boolean i1 = false; Boolean i2 = false; Boolean i3 = true; Boolean i4 = true; System.out.println(i1==i2);//true System.out.println(i3==i4);//true } }
public static final Boolean TRUE = new Boolean(true); public static final Boolean FALSE = new Boolean(false); public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; }
6、包装类的运算
public class Test { public static void main(String[] args) { Integer num1 = 100; int num2 = 100; Long num3 = 200L; System.out.println(num1 + num2); //200 System.out.println(num3 == (num1 + num2)); //true System.out.println(num3.equals(num1 + num2)); //false } }
public class Test { public static void main(String[] var0) { Integer var1 = Integer.valueOf(100); byte var2 = 100; Long var3 = Long.valueOf(200L); System.out.println(var1.intValue() + var2); System.out.println(var3.longValue() == (long)(var1.intValue() + var2)); System.out.println(var3.equals(Integer.valueOf(var1.intValue() + var2))); } }
- 当 “==”运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。
- equals(Object o) 因为原equals方法中的参数类型是封装类型,所传入的参数类型(a)是原始数据类型,所以会自动对其装箱,反之,会对其进行拆箱
7、基本数据类型在集合中的应用
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List list = new ArrayList(); list.add(1); list.add(new Object()); Iterator it = list.iterator(); while (it.hasNext()) { System.out.println(it.next()); } } }
import java.util.ArrayList; import java.util.Iterator; public class Test { public static void main(String[] var0) { ArrayList var1 = new ArrayList(); var1.add(Integer.valueOf(1)); var1.add(new Object()); Iterator var2 = var1.iterator(); while(var2.hasNext()) { System.out.println(var2.next()); } } }
8、使用中的空指针异常
public class Test { public static void main(String[] args) { Integer num = null; int int100 = num; } }