Java三大类之包装类

结论:将基本数据类型包装为一个类对象的本质就是使用Object进行接收处理。
Java中有8种数据类型,如果每种数据类型都按照以上方式编写,存在以下问题:
1.开发中代码重复
2.在进行数学计算的时候,必须利用明确的方法将包装的数据取出后才可以进行运算。
于是提供了包装类的使用,每个简单类型对应一个包装类wrapper

  • 对象型(Object的直接子类):Boolean、Character(char);
  • 数值型(Number的直接子类): Byte、Double、Short、Long、Integer(int)、Float;然后Number继承于Object类
public abstract class Number implements java.io.Serializable{}

(1)装箱:将一个简单类型隐式或显式转换成对应的包装类型,装箱后对应的包装类的实例化对象存储在堆中;将基本数据类型变为包装类对象,利用每一个包装类提供的构造方法实现装箱处理。
(2)拆箱:将一个包装类的实例对象类型转换为一个简单类型;将包装类中包装的基本数据类型取出。利用Number类中提供的六种方法

//手工装箱拆箱,JDK1.5后才有自动拆装箱机制
 Integer num=new Integer(55);//装箱
 int data =num.intValue();//拆箱
 System.out.println(data);
//自动装箱
Integer x=55;
 int i=18;
 Integer obj1=i;//隐式装箱
 Integer obj2=(Integer)i;//显式装箱
 int j=obj1;//隐式拆箱
 int k=(int)obj2;//显式拆箱
 Integer num1 = new Integer(10);
 Integer num2 = new Integer(10);
 System.out.println(num1 == num2);
 System.out.println(num1 == new Integer(10));
 System.out.println(num1.equals(new Integer(10)));
结果:
false
false
true
字符串与基本数据类型转换
1. String变为int 类型(Integer类):public static int parseInt(String s) throws
NumberFormatException
2. String变为double类型(Double类):public static double parseDouble(String s) throws
NumberFormatException
3. String变为Boolean类型(Boolean类):public static boolean parseBoolean(String s)
 String str = "123";
 double num = Double.parseDouble(str) ;
 int num1=Integer.parseInt(str);
 System.out.println(num+"--"+num1);
 结果:
 123.0--123

将字符串转为数字的时候,字符串的组成有非数字,那么转换就会出现错误(NumberFormatException),而字符串与boolean转换就不受此影响。

 String str1="123aa";
 boolean num5=Boolean.parseBoolean(str);
 System.out.println(num5);
结果:false
包装类的判断

说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,当时用直接赋值或者是Integer.valueOf()方法构造Integer对象会出现缓存现象。Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。

//源码如下:
 public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
            //不在范围的话就回new一个Integer对象
        return new Integer(i);
    }
        Integer a1 = 100;
        Integer a2 = 100;
        Integer a3=128;
        Integer a4=128;
      
        Integer obj1 = new Integer(100);
        Integer obj2 = new Integer(100);
        //用到了Integer.valueOf()的缓存
        System.out.println(a1 == a2);//true ,在缓存那个范围i
        System.out.println(a3==a4);//false,不在缓存的[-128,127]范围内
        
        System.out.println(a1.equals(a2));//true
        System.out.println(a1 == obj1);//false
        System.out.println(a1.equals(obj1));//true

        System.out.println(obj1 == obj2);//false
        System.out.println(obj1.equals(obj2));//true

远程方法(RPC)调用使用包装类型,局部变量使用基本数据类型,存储在栈中,用完就会释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值