首页 > 编程语言 >【Java教程】Day5-04 核心类:包装类与自动装箱

【Java教程】Day5-04 核心类:包装类与自动装箱

时间:2024-12-29 14:29:55浏览次数:7  
标签:Java 04 包装 Day5 int 类型 println Integer out

在Java中,数据类型分为两种:基本类型引用类型。了解它们的区别及相互转换对优化代码非常重要。

1. 基本类型 vs 引用类型

  • 基本类型byteshortintlongbooleanfloatdoublechar

  • 引用类型:所有的类 (class) 和接口 (interface)。

基本类型不能赋值为null,而引用类型可以。比如:

javaString s = null;  // 合法int n = null;  // 编译错误

 

2. 包装类:让基本类型变为对象

Java通过包装类提供了将基本类型转换为引用类型的方式。每种基本类型都有对应的包装类(Wrapper Class)。例如,intInteger包装类,booleanBoolean包装类,等等。下面是自定义包装类的示例:

javapublic class Integer {    private int value;    public Integer(int value) {        this.value = value;    }    public int intValue() {        return this.value;    }}

这样,Integer类就是int的包装类,允许我们将int作为对象处理。

 

3. 常见包装类

Java核心库提供了每种基本类型的对应包装类:

基本类型对应包装类
booleanjava.lang.Boolean
bytejava.lang.Byte
shortjava.lang.Short
intjava.lang.Integer
longjava.lang.Long
floatjava.lang.Float
doublejava.lang.Double
charjava.lang.Character

 

可以直接使用这些类而无需自己定义。

javapublic class Main {    public static void main(String[] args) {        int i = 100;        Integer n1 = Integer.valueOf(i);  // 推荐使用静态工厂方法        Integer n2 = Integer.valueOf("100");        System.out.println(n2.intValue());    }}

 

4. 自动装箱与自动拆箱

Java的自动装箱(Auto Boxing)和自动拆箱(Auto Unboxing)可以在基本类型和包装类型之间自动转换:

  • 自动装箱:基本类型转换为包装类对象。

  • 自动拆箱:包装类对象转换为基本类型。

javaInteger n = 100;  // 自动装箱int x = n;         // 自动拆箱

 

这些转换发生在编译阶段,目的是减少开发者的编码工作。

 

5. 注意事项

尽管装箱和拆箱简化了代码,但也存在性能开销,特别是拆箱时,如果包装类为null,将抛出NullPointerException

javaInteger n = null;int i = n;  // 会抛出 NullPointerException

 

6. 包装类是不可变的

包装类对象一旦创建,其内部状态无法更改。以Integer为例:

javapublic final class Integer {    private final int value;}

因此,Integer是不可变类,任何对其状态的修改都会导致创建新的对象。

 

 

7. 比较包装类对象

当比较包装类对象时,应避免使用==,而应使用equals()方法。由于Integer是不可变类,Java对于**较小的整数(-128到127)**做了缓存优化,可能会返回相同的实例。因此,==在某些情况下会返回true,但这并不是通用规则。

javaInteger x = 127;Integer y = 127;System.out.println(x == y);  // true,因为缓存优化System.out.println(x.equals(y));  // trueInteger m = 99999;Integer n = 99999;System.out.println(m == n);  // false,返回不同实例System.out.println(m.equals(n));  // true

最佳实践:始终使用equals()方法进行比较。

 

8. 创建包装类对象的推荐方式

对于包装类对象的创建,推荐使用静态工厂方法而不是new关键字。静态工厂方法可以利用缓存和优化技术,提高性能。

javaInteger n = Integer.valueOf(100);  // 推荐Integer n2 = new Integer(100);  // 不推荐

 

9. 进制转换

Integer类提供了多个方法用于进制转换。例如:

javapublic class Main {    public static void main(String[] args) {        System.out.println(Integer.toString(100));        // "100" 10进制        System.out.println(Integer.toHexString(100));     // "64" 16进制        System.out.println(Integer.toOctalString(100));   // "144" 8进制        System.out.println(Integer.toBinaryString(100));  // "1100100" 2进制    }}

 

10. Java包装类型的常用静态变量

包装类还提供了很多实用的静态变量和方法:

  • Boolean.TRUE 和 Boolean.FALSE:用于表示boolean值。

  • Integer.MAX_VALUE 和 Integer.MIN_VALUE:分别表示int类型的最大值和最小值。

  • Long.SIZE 和 Long.BYTES:表示long类型的位数和字节数。

javaBoolean t = Boolean.TRUE;Boolean f = Boolean.FALSE;int max = Integer.MAX_VALUE; // 2147483647int min = Integer.MIN_VALUE; // -2147483648int sizeOfLong = Long.SIZE;  // 64 (bits)

 

11. 处理无符号整型

Java不直接支持无符号整数(Unsigned Integers)。不过,可以通过包装类型的静态方法处理。例如,Byte提供了toUnsignedInt()方法来将有符号byte转换为无符号int

javabyte x = -1;byte y = 127;System.out.println(Byte.toUnsignedInt(x));  // 255System.out.println(Byte.toUnsignedInt(y));  // 127

 

12. 小结

  • 包装类型:用于将基本类型转换为对象类型。

  • 自动装箱与拆箱:简化代码,但可能影响性能。

  • 不变类:包装类是不可变的,对其对象的修改将创建新对象。

  • 比较包装类:始终使用equals()方法进行比较,避免使用==

  • 进制转换:包装类提供了丰富的进制转换方法。

  • 性能优化:优先使用静态工厂方法创建包装类对象。

通过理解这些概念,你可以更高效地使用Java中的包装类,同时保持代码的清晰与性能优化。

 

 

标签:Java,04,包装,Day5,int,类型,println,Integer,out
From: https://blog.csdn.net/max202011161630/article/details/144725687

相关文章