基本概念
Java的内置数据类型有7种,同时在java.lang包里对应了这7种基本类型的包装类,同时在java.util.concurrent.atomic包里有包含了线程安全版本的包装类
名称 | 类型 | 大小 | 默认值 | 包装类 | 多线程版包装类 |
---|---|---|---|---|---|
byte | 整形 | 8 | 0 | Byte | – |
short | 整形 | 16 | 0 | Short | – |
char | 字符型 | 16 | ‘u0000’ | Character | – |
int | 整形 | 32 | 0 | Integer | AtomicInteger |
float | 浮点型 | 32 | 0.0f | Float | – |
long | 整形 | 64 | 0L | Long | AtomicLong |
double | 浮点型 | 64 | 0.0 | Double | DoubleAccumulator |
boolean | 布尔型 | – | false | Boolean | AtomicBoolean |
以Integer为例,看下如何在包装类里查看基本数据信息(其他类型只需要把Integer替换成对应的包装类类名就行):
public static void main(String[] args) {
// 每个值所占二进制位数
System.out.println("Integer: " + Integer.SIZE);
// 当前数据类型最大值和最小值
System.out.println("Integer max: " + Integer.MAX_VALUE);
System.out.println("Integer min: " + Integer.MIN_VALUE);
}
/**
* 在JVM中并没有提供boolean专用的字节码指令,
* boolean类型数据在经过编译后在JVM中会通过int类型来表示,此时boolean数据4字节32位,
* boolean数组将会被编码成Java虚拟机的byte数组,此时每个boolean数据1字节占8bit
*/
类型转换
整型、实型(常量)、字符型数据可以混合运算,运算中不同类型的数据先转化为同一类型,然后进行运算,转换从低级到高级
低 ------------------------------------> 高
byte,short,char—> int —> long—> float —> double
1.自动类型转换
必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型
2.强制类型转换
条件是转换的数据类型必须是兼容的,但有可能会导致精度丢失问题
格式:(type)value type是要强制类型转换后的数据类型
拆箱装箱 & 包装类缓存
基本数据类型和自己的包装类在进行数据转换的时候会有自动拆箱和自动装箱的过程, 自动装箱时编译器调用valueOf将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值
自动装箱: Java自动将原始类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程叫做装箱
自动拆箱: 反之将Integer对象转换成int类型值,这个过程叫做拆箱
包装类同String类相似,也是非可变类,其对象一经创建,就不能修改。并且,包装类也重写了equals方法,对于相同类型的两个包装类对象,只要两个对象所包装的基本数据类型的值是相等的,则equals方法就会返回true,否则返回false。
在使用“==”比较两个包装类引用时,如果两个引用指向的地址相同(指向相同的对象),则结果为true,否则结果为false。
包装类提供了对象的缓存,具体的实现方式为在类中预先创建频繁使用的包装类对象,当需要使用某个包装类的对象时,如果该对象封装的值在缓存的范围内,就返回缓存的对象,否则创建新的对象并返回
来做个小实验吧:
public static void main(String[] args) {
// 自动装箱 -- 输出结果为 1
int i1 = 1;
Integer integer1 = i1;
System.out.println(integer1);
// 自动拆箱 -- 输出结果为 2
Integer integer2 = 2;
int i2 = integer2;
System.out.println(i2);
// 验证缓存 -- 输出结果为 true 表示两个对象的地址一样
Integer integer3 = 2;
System.out.println(integer2 == integer3);
}
over~~~ 欢迎持续关注
斜体样式参考资料:https://www.jianshu.com/p/c32d4082686f