8种基本数据类型对应类
出现原因:Java为纯面向对象语言(万物皆对象),8种基本数据类型不能new对象。 就破坏了Java为纯面向对象语言的特征,所以Java又为8种基本数据类型 分别匹配了对应的类,这种类叫做包装类/封装类
//手动装箱:基本数据类型 -> 包装类
int value = 100;
Integer integer = Integer.valueOf(value);
System.out.println(integer);
//手动拆箱:包装类 -> 基本数据类型
int intValue = integer.intValue();
System.out.println(intValue);
//JDK1.5新特性:自动拆装箱
//自动装箱:基本数据类型 -> 包装类
int value = 100;
Integer integer = value;//底层实现:Integer.valueOf(value);
System.out.println(integer);
//自动拆箱:包装类 -> 基本数据类型
int intValue = integer;//底层实现:integer.intValue();
System.out.println(intValue);
//将字符串转换为int值
String str = "123";
int parseInt = Integer.parseInt(str);//相当于自动拆箱
System.out.println(parseInt);
深入Integer底层原理
public static void main(String[] args) {
Integer integer1 = Integer.valueOf(100);//在-128 - 127之间
Integer integer2 = Integer.valueOf(100);
System.out.println(integer1 == integer2);//true
Integer integer3 = Integer.valueOf(200);//不在-128 - 127之间
Integer integer4 = Integer.valueOf(200);
System.out.println(integer3 == integer4);//false
System.out.println(integer1);
System.out.println(integer2);
System.out.println(integer3);
System.out.println(integer4);
System.out.println("--------------------");
MyInteger myInteger1 = MyInteger.valueOf(100);
MyInteger myInteger2 = MyInteger.valueOf(100);
System.out.println(myInteger1 == myInteger2);//true
MyInteger myInteger3 = MyInteger.valueOf(200);
MyInteger myInteger4 = MyInteger.valueOf(200);
System.out.println(myInteger3 == myInteger4);//false
System.out.println(myInteger1);
System.out.println(myInteger2);
System.out.println(myInteger3);
System.out.println(myInteger4);
}
public class MyInteger {
private int value;
public MyInteger(int value) {
this.value = value;
}
public int intValue(){
return value;
}
public static MyInteger valueOf(int i){
if(i>=MyIntegerCache.low && i<=MyIntegerCache.high){
return MyIntegerCache.cache[i - MyIntegerCache.low];
}
return new MyInteger(i);
}
@Override
public String toString() {//重写toString方法
return String.valueOf(value);
}
//缓存类
private static class MyIntegerCache{
private static final int low = -128;
private static final int high = 127;
private static final MyInteger[] cache;
static{
cache = new MyInteger[high - low];
int j = low;
for (int i = 0; i < cache.length; i++) {
cache[i] = new MyInteger(j++);
}
}
}