包装类及其常用方法理解
1.什么是包装类
Java的包装类是Java语言中提供的一种机制,用于将基本数据类型(如int、float、double等)封装成对应的对象。这样做的好处是,可以使得基本数据类型能够拥有对象的特性,例如可以被用作集合的元素、可以有方法调用等。Java为每种基本数据类型提供了对应的包装类:
Integer:对应基本数据类型int
Double:对应基本数据类型double
Float:对应基本数据类型float
Long:对应基本数据类型long
Short:对应基本数据类型short
Byte:对应基本数据类型byte
Character:对应基本数据类型char
Boolean:对应基本数据类型boolean
包装类提供了一些有用的方法,例如用于转换类型的方法、比较方法等。此外,包装类还实现了Comparable接口,允许对对象进行比较。
2.自动装箱和自动拆箱
2.1自动装箱
自动装箱(Autoboxing)是Java 5引入的一项特性,它允许自动将基本数据类型转换为相应的包装类对象。这种转换在编译时自动发生,无需程序员显式地进行。自动装箱提供了一种方便的方法,使得基本数据类型可以被当作对象来处理,特别是在使用Java集合框架时。
2.2自动拆箱
与自动装箱相对应,自动拆箱(Unboxing)是指在需要基本数据类型的地方,自动将包装类对象转换为基本数据类型。这同样在编译时自动完成,允许程序员在不显式进行类型转换的情况下,直接使用包装类对象的值。
2.3示例代码
自动装箱示例:
public class AutoboxingExample {
public static void main(String[] args) {
int primitiveInt = 10; // 基本数据类型
Integer boxedInt = primitiveInt; // 自动装箱,将int转换为Integer对象
System.out.println(boxedInt); // 输出Integer对象的字符串表示
}
}
自动拆箱示例:
public class UnboxingExample {
public static void main(String[] args) {
Integer boxedInt = new Integer(20); // Integer对象
int primitiveInt = boxedInt; // 自动拆箱,将Integer对象转换为int
System.out.println(primitiveInt); // 输出基本数据类型int的值
}
}
2.4自动装箱与自动拆箱的内部机制
自动装箱实际上是通过调用包装类的valueOf方法实现的。
自动拆箱实际上是通过调用包装类的xxxValue()方法实现的,例如intValue(), doubleValue()等。
2.5自动装箱与自动拆箱的注意事项
1.自动装箱和拆箱虽然方便,但可能会影响程序的性能,尤其是在循环内部进行大量装箱和拆箱操作时。
2.自动装箱可能导致NullPointerException,因为如果将null赋给基本数据类型的包装类变量,将会引发异常。
3.自动拆箱时,如果包装类对象为null,也会抛出NullPointerException。
3.包装类的常用方法
3.1 ValueOf()方法
public static Integer valueOf(int i) 根据传递的整数创建一个Integer对象
public static Integer valueOf(String s) 根据传递的字符串创建一个Integer对象
Integer i1 = Integer.valueOf(123);
Integer i2 = Integer.valueOf("hi");
3.2 toXxxString()
public static String toBinaryString(int i) 得到二进制
public static String toOctalString(int i) 得到八进制
public statid String toHexString(int i) 得到十六进制
public static int parselnt(String s) 将字符串类型的整数转成int类型的整数
//将整数转换为八进制,返回的是String类型
String str2 = Integer.toOctalString(i: 100);
System.out.println(str2);//144
3.3 parseXxx()方法
将字符串类型的整数转成int类型的整数
在8种包装类当中,除了Character都有对应的parseXxx的方法,进行类型转换
int i = Integer.parseInt(s: "123");
System.out.println(i);
3.4 toString() 方法
toString() 是Java中所有对象共有的方法,包装类也不例外。它返回包装类对象的字符串表示形式。对于包装类来说,这个字符串表示其基本数据类型的值。
public class ToStringExample {
public static void main(String[] args) {
Integer num = 100;
System.out.println(num.toString()); // 输出 "100"
}
}
3.5 equals() 方法
equals() 方法用于比较两个对象是否相等。在包装类中,equals() 方法比较的是两个对象的值是否相等,而不是它们的引用地址。这对于基本数据类型的包装类来说非常有用,因为它们可以被用于集合中,而集合通常需要比较对象的值。
public class EqualsExample {
public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
Integer c = new Integer(100);
System.out.println(a.equals(b)); // 输出 true
System.out.println(a.equals(c)); // 输出 true
}
}
3.6 compareTo() 方法
compareTo() 方法用于比较两个包装类对象的值。它返回一个整数,表示调用对象与参数对象的比较结果。如果调用对象的值小于参数对象的值,则返回负数;如果相等,则返回0;如果调用对象的值大于参数对象的值,则返回正数。
public class CompareToExample {
public static void main(String[] args) {
Integer a = 10;
Integer b = 20;
int result = a.compareTo(b);
if (result < 0) {
System.out.println(a + " is less than " + b);
} else if (result > 0) {
System.out.println(a + " is greater than " + b);
} else {
System.out.println(a + " is equal to " + b);
}
}
}
3.7 其他实用方法
除了 toString(), equals(), 和 compareTo() 方法外,包装类还提供了一些其他有用的方法,例如:
intValue(), doubleValue(), floatValue(), longValue(), byteValue(), shortValue(), booleanValue():这些方法将包装类对象转换回基本数据类型。
hashCode():返回对象的哈希码,通常用于哈希表。
valueOf():将基本数据类型转换为相应的包装类对象。
parseXxx():将字符串解析为基本数据类型,例如 Integer.parseInt()。
public class OtherMethodsExample {
public static void main(String[] args) {
Integer num = 200;
System.out.println(num.intValue()); // 输出基本类型 int
System.out.println(num.doubleValue()); // 输出基本类型 double
String str = "300";
Integer parsedNum = Integer.valueOf(str);
System.out.println(parsedNum); // 输出 Integer对象 300
System.out.println(num.hashCode()); // 输出 num的哈希码
}
}
4.注意事项
问:如何获取包装类对象?
答:不需要new,不需要调用方法,直接赋值即可。即 Integer i = 10;
Integer i6 = Integer.valueOf(127);
Integer i7 = Integer.valueOf(127);
System. out. println(i6==i7); //true
Integer i8 = Integer.valueOf(128);
Integer i9 = Integer.valueOf(128);
System. out. println(i8 == i9); //false
产生这样子的结果的原因是:在代码底层 -128~127 这个区间的数据会提前创建对象放在数组中,当使用valueOf方法时,在这个区间就会直接调用,而不是去创建一个新的地址用于存放此数据。