Java 包装类(Integer等)的详细介绍
什么是包装类
Java是一个面向对象的编程语言,但是Java中的八种基本数据类型却是不面向对象的,为了使用方便和解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八种基本数据类型对应的类统称为包装类(Wrapper Class),包装类均位于java.lang包。
八种基本数据类型与包装类的对应关系
基本数据类型 | 包装类 |
---|---|
byte | java.lang.Byte |
short | java.lang.Short |
int | java.lang.Integer |
long | java.lang.Long |
float | java.lang.Float |
double | java.lang.Double |
boolean | java.lang.Boolean |
char | java.lang.Character |
基本数据类型与其对应包装类的区别
-
数据类型不同
一个是基本数据类型,一个是引用数据类型
-
存储位置不同
基本数据类型直接将数据保存在栈中,包装类直接将数据保存在堆中
-
null的处理不同
基本数据类型不能赋空值,包装类可以赋空值
-
初始值不同
在基本数据类型中,整数类型的初始值是0,小数类型的初始值是0.1,boolean类型的初始值是false,char类型的初始值是’’(空字符)
在包装类中,所有类型的初始值都为null
给包装类赋值的方式
// 方式一
Integer integer1 = new Integer(10);
// 方式二
Integer integer2 = Integer.valueOf(10);
// 方式三
Integer integer3 = 10;
注:其他包装类同理
装箱与拆箱
装箱:指将基本数据类型转换为包装类对象
拆箱:指将包装类对象转换为基本数据类型
// 手动装箱
Integer integer = Integer.valueOf(10);
// 手动拆箱
int i = integer.intValue();
JDK1.5之后,可以进行自动装箱和自动拆箱
// 自动装箱(等同于Integer.valueOf(10))
Integer integer = 10;
// 自动拆箱(等同于integer.intValue())
int i = integer;
注:其他包装类同理
包装类的缓存问题
示例一
Mr-Apple: 知道为什么是必须吗
做而论道_CS: 由补码换算到十进制数,也极其简单。 你只需记住:【补码首位的权,是负数】。 一般的八位二进制数,各个位的权是: 128、64、32、16、8、4、2、1; 如果是八位的补码,各个位的权则是: -128、64、32、16、8、4、2、1。 例如,补码是:1110 0001, 它代表的十进制是:-128 + 64 + 32 + 1 = -31。 又如,补码是:0110 0001, 它代表的十进制是:0 + 64 + 32 + 1 = +97。 你看吧,仅仅使用【进制转换】,就完事了! 哪里还需要用到原码反码? ------------ 实际上,二进制数,它就是数! 什么原码反码补码,都是不存在的事! 不存在,为什么还要讲、还要学、还要考研? 因为,计算机老师讲这些,可以赢得丰厚的利益! 所以,这些老师,才会毁人不倦坑人不浅!
做而论道_CS: 在两位十进制数运算中,舍弃进位,就是减去了一百。 所以,加 99,再减 100,当然就是 “-1” 了。 八位二进制数是:0000 0000 ~ 1111 1111。 也就是十进制数:0 ~ 255。 如果有进位,就是:256。 此时,加上 255 (1111 1111),再舍弃进位 256, 这不也就是-1 吗? 所以:+255 (1111 1111),就是-1; 同理:+254 (1111 1110),就是-2; +253 (1111 1101),就是-3; 。。。 +128 (1000 0000),就是-128。 这些正数,就是计算机专家 “发明” 的【补码】。 另外,加上 127 (0111 1111),是不会出现进位的。 那么,也就不用舍弃进位,也就不用减 256 了。 所以,加上 127,就不会出现 “减法的作用”。 因此,0 ~ 127,这些就是【正数】。 (正数就是正数,不应该称为 “补码”。) ------------------ 老外的算术能力很差,不懂什么是进位, 更弄不懂什么是舍弃进位。 所以,就编造了一套谎言: 机器数真值符号位原码反码补码正数三码相同 负数取反加一符号位不变符号位也参加运算模 我们的老师,数学底子也很差啊! 小学的算术,都看不透,就被老外忽悠瘸了! 天天喋喋不休的:原码反码取反加一。。。 也不知道有多少学生因此而挂科。
做而论道_CS: 哪有什么原码反码补码呀! 虽然,计算机使用的,是二进制数。 但是,二进制数,也是数,和十进制数,是雷同的。 二进制数,并不是什么原码反码补码。 符号位,也是根本就不存在的。 所谓的“补码”,不过是一道小学算术题而已。 所谓的“补码”,与什么进制,都没有关系。 所谓的“补码”,也不是计算机专家发明的。 另外,在码长八位时,各码的范围如下。 原码:-127 ~ +127; 反码:-127 ~ +127; 补码:-128 ~ +127。 看到了吧? -128 只有补码,没有原码和反码。 没有原码,你拿什么取反? 没有反码,你拿什么加一? 取反加一,不可用! -128 的补码,你是怎么得来的呢? 实际上,取反加一,根本就没有任何理论依据。 只是计算机专家用来唬弄老外的! 你还想跟着老外学算术? 你直接就掉坑里了! ------------------ 你看看十进制数吧,两位的:0~99。 最大值 99,就能当做“负一”来用。 如:27 + 99 = (一百) 26 27 - 1 = 26 只要你忽略进位,仍旧保持两位数,它们就是相等的。 由此可知,舍弃了进位: 正数,就能当做负数来用。 加法,也就能实现减法运算。 在计算机中,舍弃进位,会怎样: 可以省略减法器,简化硬件! 只需配置一个加法器,便可走遍天下。 如果你明白什么是 “舍弃进位”: 你就会懂得 “补码的来源与意义”。 老外,是不懂这些的。 所以,才编造了:符号位原码。。。
lgq2016: jdk1.8默认的-XX:+UseParallelGC应该是: Parallel Scavenge(年轻代)+Serial Old(老年代)