Java 包装类

Java 包装类

为什么需要包装类

将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据。

常用的操作之一:用于基本数据类型与字符串之间的转换。

基本数据类型与包装类的对应关系

byte → Byte

short → Short

int → Integer

long → Long

float → Float

double → Double

char → Character

boolean→ Boolean

包装类的集成关系

img

包装类的基本操作

img

Integer类

Integer 类在对象中包装了一个基本类型 int 的值,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。

// 构造Integer
Integer i1 = new Integer(123);
Integer i2 = new Integer("123");

String和int类型的相互转换

// int转String
int i = 100;
String s1 = i + " ";
String s2 = String.valueOf(i);

// String转int
String s3 = "123";
Integer i3 = new Integer(s3);
int i4 = i3.intValue();
int i5 = Integer.parseInt(s3);

JDK5的新特性自动装箱和拆箱

// 自动装箱
Integer i1 = 100;
// 自动拆箱
int i2 = i1;

思考1

Integer i1 = 97;
Integer i2 = 97;
System.out.println(i1 == i2);
System.out.println(i1.equals(i2));
System.out.println("-----------");

Integer i3 = 197;
Integer i4 = 197;
System.out.println(i3 == i4);
System.out.println(i3.equals(i4));
/*
true
ture
-----------
false
true
*/

分析:因为-128~127是byte的取值范围,如果在这个取值范围内,自动装箱就不会创建新的对象,而是从常量池中获取,超过了byte取值范围就会再创建新对象~这个就是 i1==i2 的结果为 true 的原因了。

思考2

public class Test_Integer {

public static void main(String[] args) {

Integer i1 = new Integer(97);
Integer i2 = new Integer(97);
System.out.println(i1 == i2);
System.out.println(i1.equals(i2));
System.out.println("----------------");

Integer i3 = new Integer(197);
Integer i4 = new Integer(197);
System.out.println(i3 == i4);
System.out.println(i3.equals(i4));
System.out.println("----------------");

Integer i5 = 97;
Integer i6 = 97;
System.out.println(i5 == i6);
System.out.println(i5.equals(i6));
System.out.println("----------------");

Integer i7 = 197;
Integer i8 = 197;
System.out.println(i7 == i8);
System.out.println(i7.equals(i8));

}
}
/*
false
ture
----------------
false
true
----------------
true
true
----------------
false
true
*/

分析:

在String类前面文章,我们画过内存图。已经了解到== 这个符号既可以比较基本数据类型和引用数据类型,如果是基本数据类型,比较的是值相同,如果是引用数据类型,比较的是对象的内存地址是否相同。利用equals方法比较的是值是否相同,因为Integer类里面重写了Object类的equals方法。

所以,上面的equals方法打印输出都是true,这个很简单,没有疑问。然后来看,前面两组里面的==判断,由于==是比较内存地址,我们看到s1 s2 s3 s4都使用了new关键字,所以这两组里面的==比较也是不相等,内存地址不同。

最后来看后两组,同样是自动包装,为什么97就输出true,而197就不相等。我们这里先抛出个结论:在Java中,byte的取值范围是-128到127之间。在自动包装和拆箱中,如果变量取值范围在byte的范围内,在自动包装和拆装过程中就不新创建对象(堆内存);如果范围不在byte取值范围内,就会新创建Integer对象。

参考

https://www.cnblogs.com/wq-9/p/10305002.html

https://blog.csdn.net/y0q2t57s/article/details/81039200

https://blog.csdn.net/u011541946/article/details/79978325

Author: pangzibo243
Link: https://litianbo243.github.io/2019/10/01/Java-包装类/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
支付宝打赏
微信打赏