包装类

包装类

Java是一门面向对象的语言,但是Java的八种基本数据类型却没有对象的特征,更没有对象的功能(没有属性,不能调用方法)

基本数据类型不能调用方法,这就给我们很多的操作带来不便,另外容器(例如List、HashMap等)基本接收存储的都是

Object,不能接收基本数据类型。为了解决这个问题我们就要把所谓的基本数据类型包装成对象,使其具有对象的特征来方便使用


拆箱与装箱

基本类型 包装类型
byte Byte
short Short
int Integer
long Long
char Character
float Float
Double Double
boolean Boolean

装箱与拆箱

//首先创建一个基本类型数据
int age = 10;

//装箱
Integer integer1 = new Integer(num);

//拆箱
int age2 = integer1.intValue();

自动装箱和拆箱

int id = 01;

//自动装箱
Integer integer2 = id;

//自动拆箱
int age = integer2;

注意点:

  • 自动拆箱和自动装箱实现其实是一样的,我们使用idea的反编译class文件就能发现,只是jvm在编译的时候帮你做了这些操作。

基本类型和字符串转换

基本类型转换为字符串类型

方法1:

int age 10;

String str = age + "";

方法2:

int age = 10;

String str = Integer.toString =(age);

字符串类型转换为基本类型

String str = "12";

int num = Integer.parseInt(str);

注意:字符串转换为基本数据类型只能是纯数字,不然会报错

image-20210412111920707

image-20210412111933978


Boolean字符串形式转换成基本类型

String string = "true";
boolean b1 = Boolean.parseBoolean(string);
System.out.println(b1);

注意点:这个布尔类型的数组为true则返回的是true,如果是其他的就是false。

需保证类型兼容性,否则抛出NumberFormatException异常


整数缓冲区

Java预先创建了256个常用的整数包装类型对象

面试题:

//这两个Integer对象相等吗?
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
System.out.print(i1 == i2);

答案当然是false,地球人都知道,它new了一个对象,所以内存地址是不一样的

Integer i3 = 100;
Integer i4 = 100;
System.out.print(i3 == i4);

这样的输出结果我可以很明确的告诉你是true

因为在class文件里,也就是在编译的过程中,i3 = 100;不是new Integer(100);而是调用了Integer类里的Integer.valueOf();

所以他们比的是值。

Integer i5 = 200;
Integer i6 = 200;
System.out.print(i5 == i6);

这一代码输出结果则是false,很奇怪,和上面的那个代码一样,为什么是false。

这就和整数的缓冲区有关系了,我们走进Integer的valueOf方法看看源码

image-20210412150046179

这里有两个数,一个是low,一个是high,定义的一个是-128一个是127那么我这里输出的是200,不在他的缓冲区,那么就会返回一个new Integer(i)。那和第一个比方式是一样的。

整数缓冲区能减少一些不必要的内存浪费


posted @ 2021-04-12 15:54  SHE_HYH  阅读(47)  评论(0)    收藏  举报