在Java中,数据类型分为两种:基本类型和引用类型。了解它们的区别及相互转换对优化代码非常重要。
1. 基本类型 vs 引用类型
-
基本类型:
byte
,short
,int
,long
,boolean
,float
,double
,char
。 -
引用类型:所有的类 (
class
) 和接口 (interface
)。
基本类型不能赋值为null
,而引用类型可以。比如:
java
String s = null; // 合法
int n = null; // 编译错误
2. 包装类:让基本类型变为对象
Java通过包装类提供了将基本类型转换为引用类型的方式。每种基本类型都有对应的包装类(Wrapper Class)。例如,int
有Integer
包装类,boolean
有Boolean
包装类,等等。下面是自定义包装类的示例:
java
public class Integer {
private int value;
public Integer(int value) {
this.value = value;
}
public int intValue() {
return this.value;
}
}
这样,Integer
类就是int
的包装类,允许我们将int
作为对象处理。
3. 常见包装类
Java核心库提供了每种基本类型的对应包装类:
基本类型 | 对应包装类 |
---|---|
boolean | java.lang.Boolean |
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
char | java.lang.Character |
可以直接使用这些类而无需自己定义。
java
public 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)可以在基本类型和包装类型之间自动转换:
-
自动装箱:基本类型转换为包装类对象。
-
自动拆箱:包装类对象转换为基本类型。
java
Integer n = 100; // 自动装箱
int x = n; // 自动拆箱
这些转换发生在编译阶段,目的是减少开发者的编码工作。
5. 注意事项
尽管装箱和拆箱简化了代码,但也存在性能开销,特别是拆箱时,如果包装类为null
,将抛出NullPointerException
。
java
Integer n = null;
int i = n; // 会抛出 NullPointerException
6. 包装类是不可变的
包装类对象一旦创建,其内部状态无法更改。以Integer
为例:
java
public final class Integer {
private final int value;
}
因此,Integer
是不可变类,任何对其状态的修改都会导致创建新的对象。
7. 比较包装类对象
当比较包装类对象时,应避免使用==
,而应使用equals()
方法。由于Integer
是不可变类,Java对于**较小的整数(-128到127)**做了缓存优化,可能会返回相同的实例。因此,==
在某些情况下会返回true
,但这并不是通用规则。
java
Integer x = 127;
Integer y = 127;
System.out.println(x == y); // true,因为缓存优化
System.out.println(x.equals(y)); // true
Integer m = 99999;
Integer n = 99999;
System.out.println(m == n); // false,返回不同实例
System.out.println(m.equals(n)); // true
最佳实践:始终使用equals()
方法进行比较。
8. 创建包装类对象的推荐方式
对于包装类对象的创建,推荐使用静态工厂方法而不是new
关键字。静态工厂方法可以利用缓存和优化技术,提高性能。
java
Integer n = Integer.valueOf(100); // 推荐
Integer n2 = new Integer(100); // 不推荐
9. 进制转换
Integer
类提供了多个方法用于进制转换。例如:
java
public 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
类型的位数和字节数。
java
Boolean t = Boolean.TRUE;
Boolean f = Boolean.FALSE;
int max = Integer.MAX_VALUE; // 2147483647
int min = Integer.MIN_VALUE; // -2147483648
int sizeOfLong = Long.SIZE; // 64 (bits)
11. 处理无符号整型
Java不直接支持无符号整数(Unsigned Integers)。不过,可以通过包装类型的静态方法处理。例如,Byte
提供了toUnsignedInt()
方法来将有符号byte
转换为无符号int
。
java
byte x = -1;
byte y = 127;
System.out.println(Byte.toUnsignedInt(x)); // 255
System.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