包装类[java]

⛳️我们为什么要创建包装类?

️️️️ Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类,包装类就是将基本数据类型封装成一个类,让这个基本数据类型作为类的一个属性

  • 包装类(如:Integer,Double等)这些类封装了一个相应的基本数据类型数值,并为其提供了一系列操作方法。

八种数据类型对应的包装类:

基本数据类型对应包装类包装类的父类
bytejava.lang.Bytejava.lang.Number
shortjava.lang.Shortjava.lang.Number
intjava.lang.Integerjava.lang.Number
longjava.lang.Longjava.lang.Number
floatjava.lang.Floatjava.lang.Number
doublejava.lang.Doublejava.lang.Number
booleanjava.lang.Booleanjava.lang.Object
charjava.lang.Characterjava.lang.Object

注意:

  1. java八种基本数据类型的字节数:分别为1、2、4、8个字节;1字节(byte、boolean)、 2字节(short、char)、4字节(int、float)、8字节(long、double);

  2. 八种基本数据类型的包装类,除了char的是Character、int类型的是Integer,其他都是首字母大写;

  3. 对应包装类的直接父类:前6个由于是数,直接父类为Number,而后两个的直接父类就是Object类;

对于包装类来说,这些类的用途主要包含两种:

● 作为和基本数据类型对应的类类型存在。

● 包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。

常用常量:

①SIZE:表述这个具体对象的value值的二进制表示形式下的位数

②BYTES:表示这个包装类对应基本类型的字节数(byte)

  • 一个字节(byte)==八位(bit);

  • 比如:Integer对应的基本数据类型就是int类型,一个int类型的对象占四个字节

③ MAX_VALUE: 表示 int 型可取的最大值

④ MIN_VALUE: 表示 int 型可取的最小值

案例:

System.out.println(Integer.MIN_VALUE);//int类型可取的最小值:-2147483648
System.out.println(Integer.MAX_VALUE);//int类型可取的最大值:2147483647
System.out.println(Integer.BYTES);//int类型的字节数:4
System.out.println(Integer.SIZE);//int类型的二进制位数:32

⛳️包装类常用属性方法

  • 以下都以Integer为例 

1.构造方法

①Integer(int a);

  • 以 int 型变量作为参数创建 Integer 对象,实例代码如下:

Integer a = new Integer(8);

②Integer(String a);

  • 以 String 型变量作为参数创建 Integer 对象,实例代码如下:

Integer number=new Integer("8");

2.比较方法

①public static int compareTo(Integer anotherInteger );

  • 在数字上比较两个 Integer 对象,如果这两个值相等,则返回 0;如果调用对象的 数值小于 anotherInteger 的数值,则返回负值;如果调用对象的数值大于anotherInteger 的数值,则返回正值

②public boolean equals(Object IntegerObj );

  • 比较此对象与指定对象是否相等

③public int max(int a,int b);

  • 返回a、b中数值大的

④public int min(int a,int b);

  • 返回a、b中数值小的

3.转换方法

①public static toBinaryString(int i);

  • 十进制转为二进制形式

②public static String toHexString(int i);

  • 十进制转为十六进制形式

③public static String toOctalString(int i);

  • 十进制转换为八进制

案例:

public class IntegerDemo1 {
    public static void main(String[] args) {
        //转2进制
        System.out.println(Integer.toBinaryString(3));//11
        //转16进制
        System.out.println(Integer.toHexString(17));//11
        //转8进制
        System.out.println(Integer.toOctalString(9));//11
    }
}

④public int intValue();

  • 返回这个对象的value值

⑤public static int parseInt(String s);

  • 将String类型的实参转换为int类型

  • 注意:在转换时要保证这个String实参可以转换为int类型,如果这个字符串中包含有字母,那么就会出现转换异常

⑥public String toString();

  • 返回一个表示该Integer 值的 String 对 象

⑦static Integer valueOf(int i);

  • 将int类型的数值转换为Integer类型

⑧static Integer valueOf(String s);

  • 将String类型的转换为Integer类型

案例:

public class IntegerDemo1 {
    public static void main(String[] args) {
       Integer i1 = new Integer(10);//基本类型包装到对象中
       int i2 = i1.intValue();//把对象中的基本类型取出来
​
       int i3 = Integer.parseInt("10");//将String类型转为int类型
       i1.toString();//将int包装类型转为String类型
​
       Integer i4 = Integer.valueOf(10);//将基本类型转为引用类型
       Integer i5 = Integer.valueOf(10);//将String类型转为引用类型
    }
}

⛳️自动装箱和自动拆箱

1.概念

  • 简介:jdk1.5之后的新特性。该特性是编译器认可的,是在编译器自动将基本数据类型和包装类相互转换,节省了麻烦。

  • 自动装箱:java编译器自动将基本数据类型转换为包装类,自动调用的是valueOf方法

  • 自动拆箱:java编译器自动将包装类转换为基本数据类型,拆箱的时候自动调用的是xxxValue方法

案例:

public void IntegerDemo() {
        //自动装箱
        Integer a=12;//原理是Integer a = Integer.valueOf(12);
        //自动拆箱
        int b=a+1;//原理是int b = a.intValue()+1;
        
        Integer c=123;
        Integer d=123;
        Integer e=c+d;
        /*原理为Integer e=Integer.valueOf(c.intValue()+d.intValue());*/
}

2.valueOf()方法源码研究

  • 按住ctrl键,鼠标点击该方法即可查看源码,下面以Integer类的valueOf(int i)为例

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}
  • 理解:由于我们经常会将-128-127之间的数进行包装成类,所以我们就在Integer的内部定义了一个IntegerCache结构,IntegerCache中定义了Integer [] 数组在这个数组中保存了-128-127范围之间的整数,我们使用自动装箱的方式给Integer赋值时, Integer类的valueOf(int i)方法首先会判断i是否在-128~127之间,如果在的话,就返回的对象是Integer类中静态数组cache中的对象,如果不是在这之间,就会重写创建一个新的对象。

通过查看其它类该方法的源码之后,可以得到该表:

包装类valueOf(X i)返回对象原则
Byte

直接取,数组范围为(-128,127),且byte值的范围也是(-128,127)

Short

(-128,127)之间在数组中取,否则new
Integer(-128,127)之间在数组中取,否则new
Long(-128,127)之间在数组中取,否则new
Float直接new
Double直接new
Boolean直接返回,不new
Character(0,127)之间从数组中取,否则new

3.包装类比较

/*
 自动装箱时采用valueOf方法,由于127在静态数组的范围内,所以不是new的,
 而128的两个引用是指向  new出现对象的,所以第一个是true,第三个是false
 而包装类和基本数据类型比较时,只要数值是相等的,就相等
*/
public class IntegerDemo {
      public static void main(String[] args) {
           Integer a1=127;
           Integer a2=127;
           int a3=127;
           Integer b1=128;
           Integer b2=128;
           int b3=128;
        System.out.println(a1==a2);//true
        System.out.println(a1==a3);//true
        System.out.println(b1==b2);//false
        System.out.println(b1==b3);//true   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chen☆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值