Bootstrap

Java核心API——包装类

 包装类简介


        基本数据类型(如int, float, double, char, boolean等)是直接在栈内存中分配的,它们不是对象,因此不能直接调用对象所拥有的方法。为了克服这个限制,Java为每个基本数据类型提供了对应的包装类,包装类的出现是为了解决8个基本类型不能直接参与面向对象开发的问题。本质上讲
就是可以通过包装类让基本类型以"对象"的形式出现。 java为8个基本类型提供了8个包装类。

int->Integer
char->Character

其他包装类的类名与基本类型一致,只是首字母大写。如:
double->Double

包装类作用 

  1. 提供方法支持:包装类为它们所封装的基本数据类型提供了丰富的方法。例如,Integer类提供了parseInt(String s, int radix)来将字符串转换为整数,toString()方法将整数转换为字符串等。
  2. 支持泛型:在Java中,泛型(Generics)是一种在编译时期进行类型检查的机制,它不允许基本数据类型作为类型参数。这意味着,如果你需要在集合(如List, Set等)中存储基本数据类型的数据,你必须使用它们的包装类。例如,List<Integer>是合法的,但List<int>不是。
  3. 基本数据类型与对象之间的转换:包装类提供了在基本数据类型和对象之间转换的便捷方式。例如,通过Integer.valueOf(int i)可以将int转换为Integer对象,通过Integer.intValue()可以将Integer对象转换回int。
  4. 实现接口:包装类实现了某些接口,这使得它们能够用在需要这些接口实现的场景中。例如,Integer类实现了Comparable接口,这使得Integer对象能够直接用于排序等操作。
  5. 提升代码的灵活性和可维护性:通过使用包装类,可以在需要时轻松地添加新的方法或行为,而无需修改基本数据类型的定义。这有助于保持代码的灵活性和可维护性。

代码实例 

 

        int i = 13;
        Integer i1 = new Integer(i);

/*
爆红原因:
    从Java 9开始,虽然Integer(int)构造函数没有被正式标记为@Deprecated(即没有显式地标记为过时),
    但Java官方推荐使用自动装箱(autoboxing)而不是直接调用构造函数来创建Integer对象。
    自动装箱是Java 5(也称为Java 1.5)引入的一个特性,它允许自动将基本数据类型(如int)转换为对应的包装类型(如Integer),而无需显式调用构造函数。
    因此,在Java 5及更高版本中,您可以直接将基本数据类型赋值给包装类型的变量,Java编译器会自动完成转换。

    使用自动装箱
        Integer i1 = i; // Java会自动将int转换为Integer

 */
        Integer i2 = i;
        System.out.println(i1 == i);//true
        System.out.println(i2 == i1);//false
        //在包装类中都重写了equals方法
        System.out.println(i2.equals(i1));//true

        /*
            包装类提供了静态方法valueOf,可以将对应的基本类型转换为包装类
            推荐这种方式,而不是直接new。
            Integer的valueOf会像字符串String一样,去缓存对象。但是它只
            缓存-128到127之内的数字。其余的全部为new。
         */

        i = 128;
        Integer i3 = Integer.valueOf(i);
        Integer i4 = Integer.valueOf(i);
        System.out.println(i3 == i4);//false


        double d = 123.123;
        Double d1 = Double.valueOf(d);
        Double d2 = Double.valueOf(d);
        System.out.println(d1 == d2);//是否为同一对象  false
        System.out.println(d1.equals(d2));//内容是否相同  true

        int in = i4.intValue();
        System.out.println(in);
        //可以从其他类型传出
        long lon = i4.longValue();
        System.out.println(lon);
        //溢出现象任然会丢失精度
        byte byt = i4.byteValue();
        System.out.println(byt);


        /*
            数字类型的包装类:
            Byte,Short,Integer,Long,Float,Double
            上述6个包装类统一继承自Number的类
            Number中定义了一组方法:
            int intValue()
            byte byteValue()
            short shortValue()
            ...
         */
        //小数包装类如果转换为整数,会丢失精度
        in = d1.intValue();//d1:123.123-->int:123
        System.out.println(in);//123
        double dou = d1.doubleValue();
        System.out.println(dou);//123.123

包装类中定义了常量表达其基本类型的取值范围

包装类提供一个静态方法:parseXXX(String str)

将字符串解析为对应的基本类型
String——>基本类型

        int i_max = Integer.MAX_VALUE;
        System.out.println(i_max);//2147483647
        int i_min = Integer.MIN_VALUE;
        System.out.println(i_min);//-2147483648

        double d_max = Double.MAX_VALUE;
        System.out.println(d_max);//1.7976931348623157E308

        String str = "123";
        int i = Integer.parseInt(str);
        System.out.println(i);
        double d = Double.parseDouble(str);
        System.out.println(d);

        String str2 = "123.123";
        /*
            包装类将字符串转换为基本类型时,要求该字符串要正确描述基本类型
            可以保存的值,否则会抛出NumberFormatException
                                数字   格式  异常
         */
//        i = Integer.parseInt(str2);
//        System.out.println(i);
        d = Double.parseDouble(str2);
        System.out.println(d);
        float f = Float.parseFloat(str2);
        System.out.println(f);

 

 

 

 

;