Java —— 初识包装类
每博一文案
蔡康永曾经这样描述幸福感,我对于幸福感的一个重要的标准是,我可不可以
常常对很多不喜欢的事情说不,是一件非常幸福的事情,是因为你不用强迫自己掉入
一个泥沼中,无法脱身。人生就像一个收纳盒,有些东西渴望装进囊中,却始终得不到。
有些东西不想要,却又不得不接受,总是有诸多遗憾。
一路走来,我们总是带着太多的委屈,而最让自己深陷在对过去的叹息中的,莫过于
这两件事,亏欠了真正对你好的人,和愧对了,陪伴你醉酒的自己,听过这样一句话,
只有会珍爱自己的人,才更懂得爱人,我们活在这个世上,不能讨所有人欢喜,也
不能事事都完美。
—————— 一禅心灵庙语
包装类
基本数据类型就是操作字面值,简单明了。在基本数据类型的字面值基础上,加入一些基础,方法,构造器,将基本数据类型封装为一个类,这个类就是包装类,基本数据类型有 8 种,对应的包装类也是为 8 种,如下表
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
从表上看,我们可以注意到 除了 char 、int其他的包装类都是对应类型的大写字母 ,所以我们只需要特别记住 int ——> Integer、char ——> Character就可以了.其中的包装类基本上都是在 java.lang包 下的,不需要导入包,可以直接使用.包装类主要用于在泛型上,想要了解泛型,大家可以移步到🔜🔜🔜 Java —— 初始泛型
这些包装类,都是被 final 修饰的是无法被继承的
public final class Float extends Number implements Comparable<Float> { }
public final class Boolean implements java.io.Serializable,
Comparable<Boolean> { }
包装类的 "装箱(boxing)“和"拆箱(unboxing)”
/**
* 包装类
*/
public class Blog14 {
/*
包装类的装箱,拆箱
*/
public static void main(String[] args) {
int i = 10;
// 装箱操作,新建一个Integer类型对象,将i的值放入对象的某个属性中
Integer ii = Integer.valueOf(i); // 第一种方式,调用装方法
Integer ij = new Integer(i); // 第二种方式,调用构造方法
// 拆箱操作,将Integer对象中的值取出,放到一个基本数据类型中,通过调用方法
int n = ij.intValue();
System.out.println(n);
double d = ii.doubleValue();
System.out.println(d);
}
}
装箱/装包: 将基本数据类型包装为— > 包装类类型
拆箱/装箱: 将包装类型 — > 基本数据类型
自动装箱(outoboxing) 和 自动拆箱 (outounboxing)
可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,Java提供了自动机制
public class Blog14 {
/*
包装类的自动装箱,拆箱机制
*/
public static void main(String[] args) {
Integer num = 10; // 自动装箱
int n = num; // 自动拆箱
double d = num; // 自动给拆箱
System.out.println(n);
System.out.println(num);
}
}
并不是所有基本类型之间都是可以自动相互转换的,需要符号类型之间转换的规则: 小类型可以转为大类型,大类型无法转为小类型,具体细节大家可以参考🔜🔜🔜 Java类型转换(注意事项)_ChinaRainbowSea的博客-CSDN博客,不行的调用对应的方法,
public class Blog14 {
/*
包装类的自动装箱,拆箱机制
*/
public static void main(String[] args) {
Integer num = 10;
char c = num;
}
}
还可以通过包装类获取对应基本数据类型的最大值,和最小值
public class Blog14 {
public static void main(String[] args) {
Integer n = 10;
System.out.println("该基本类型的最大值: "+n.MAX_VALUE);
System.out.println("该基本类型的最小值: "+n.MIN_VALUE);
}
}
大家再来看一道有关的面试题
public class Blog14 {
public static void main(String[] args) {
Integer a = 200;
Integer b = 200;
System.out.println(a == b);
Integer c = 128;
Integer d = 128;
System.out.println( c == d);
Integer f = 127;
Integer g = 127;
System.out.println( f == g);
}
}
解析
为什么会出现这样的情况呢,一会相等,一会又不相等呢
我们先从源码上出发:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127;
从源码上我们可以到 low 是为 -128 ,high 是为 127 ,我们单独阅读
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
可以发现, 当 i >= -128 && i <= 127 的时候,在该范围内,每次的取值是在IntegerCache.cache[] 数组中取的数值的,在该范围内取的数值的来源是相同的,自然也就是会相等的,但是当,需要取的值是超出该范围的时候,是return new Integer(i); 通过 new 了一个对象出来,而在引用类型中的 == 等号,比较的就并不是数值了,而是其引用对象的地址,所以超过该范围的取值,比较时是地址,不是数值,结果就可能不相等了。
最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,江湖再见,后会有期!