Java 有八种基本类型。
byte
byte 数据类型是 $8$ 位、有符号的,以二进制补码表示的整数。-128 ( $-2^{7}$ )。127 ( $2^{7} - 1$ )。0。short
short 数据类型是 $16$ 位、有符号的以二进制补码表示的整数。-32768 ( $-2^{15}$ )。32767 ( $2^{15} - 1$ )。0。int
int 数据类型是 $32$ 位、有符号的以二进制补码表示的整数。-2,147,483,648 ( $-2^{31}$ )。2,147,483,647 ( $2^{31} - 1$ )。int 类型。0。long
long 数据类型是 $64$ 位、有符号的以二进制补码表示的整数。-9,223,372,036,854,775,808 ( $-2^{63}$ )。9,223,372,036,854,775,807 ( $2^{63} - 1$ )。0L。float
float 数据类型是单精度、$32$ 位、符合 IEEE 754 标准的浮点数。float 在储存大型浮点数组的时候可节省内存空间。0.0f。double
double 数据类型是双精度、$64$ 位、符合 IEEE 754 标准的浮点数。double 类型。0.0d。boolean
boolean 数据类型表示一位的信息。true 和 false。true/false 情况。false。char
char 类型是一个单一的 $16$ 位 Unicode 字符。\u0000 (即为 0 )。\uffff (即为 65,535 )。每一个基本类型都有一个属于它的包装类,比如 int 和 Integer,bool 和 Boolen。
下面以 int 和 Integer 为例说明两种的差别:
Integer 变量必须实例化后才能使用,而 int 变量不需要。Integer 可以是 null ,而 int 不行。Integer 实际是对象的引用,当 new 一个 Integer 时,实际上是生成一个指针指向此对象;而 int 则是直接存储数据值。由于 Integer 变量实际上是对一个 Integer 对象的引用,所以两个通过 new 生成的 Integer 变量永远是不相等的(因为 new 生成的是两个对象,其内存地址不同)。
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j);
输出:
false
通过观察 Integer 的 equals 函数,可以发现两者比较的是 value 值,也就是被包装的值。
Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i.equals(j));
输出:
true
只要两个变量的值是相等的,则结果为 true (因为包装类 Integer 和基本数据类型 int 比较时,java 会自动拆包装为 int,然后进行比较,实际上就变为两个 int 变量的比较)
Integer i = new Integer(100);
int j = 100;
System.out.println(i.equals(j));
System.out.println(i == j);
输出:
true
true
结果总是为 false。(因为非 new 生成的 Integer 变量指向的是 java 常量池中的对象,而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同)
Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j);
输出:
false
当两个变量的值在区间 $-128$ 到 $127$ 之间,则比较结果为 true;
当两个变量的值不在此区间,则比较结果为 false。
Integer i = 100;
Integer j = 100;
System.out.println(i == j);
输出:
true
Integer i = 200;
Integer j = 200;
System.out.println(i == j);
输出:
false
因为 Java 在编译 Integer i = 100;时,会翻译成为 Integer i = Integer.valueOf(100);,而 Java API 中对 Integer 类型的 valueOf 的定义如下:
public static Integer valueOf(int i){
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high){
return IntegerCache.cache[i + (-IntegerCache.low)];
}
return new Integer(i);
}
所以,Java 对于$-128$到$127$之间的数,会进行缓存,Integer i = 127 时,会将 $127$ 进行缓存,下次再写 Integer j = 127 时,就会直接从缓存中取,就不会 new 了
因为 Integer.equals(int) 时会把 int 转换成 Integer 再进行比较,根据Integer 的 equals 函数,它们总是相等的。
一般我们通过 int 来使用整形变量,但是对于一些返回值可能是 null 的函数,我们需要用 Integer 去装这个返回值来防止报错。
特别的:Integer 的构造函数在 JDK 9.0已经弃用,可能在将来的某个版本的 JDK 种消失,所以请使用 Integer i = 100 这种方式初始化 Integer。
原文:https://www.cnblogs.com/jhy16193335/p/10463449.html