Integer
数据类型
1、内置数据类型(基本数据类型)
Java有如下的内置数据类型:
项 | 定义 | 位数 | 表示范围 |
---|---|---|---|
byte | byte 数据类型是8位、有符号的,以二进制补码表示的整数 | 8位 | -128至127 |
short | short 数据类型是 16 位、有符号的以二进制补码表示的整数 | 16位 | -215至215-1 |
int | int 数据类型是32位、有符号的以二进制补码表示的整数 | 32位 | -231至231-1 |
long | long 数据类型是 64 位、有符号的以二进制补码表示的整数 | 64位 | -263至263-1 |
float | float 数据类型是单精度、32位、符合IEEE 754标准的浮点数,表示形式为3.2f | 32位 | 1.4E-45至3.4028235E38 |
double | double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数; | 64位 | 4.9E-324至1.7976931348623157E308 |
char | char 类型是一个单一的 16 位 Unicode 字符; | 16位 | 0至65535 |
2、引用数据类型
引用数据类型分为数组、类、接口。
3、封装类类型
Java为每个基本数据类型提供了封装类,对应关系如下:
基本数据类型: boolean,char,byte,short,int,long,float,double
封装类类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
4、int与Integer的基本使用对比
Integer是int的包装类;int是基本数据类型;
Integer变量必须实例化后才能使用;int变量不需要;
Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
Integer的默认值是null;int的默认值是0。
5、int与Integer的详细对比
(1)因为Integer变量是对Integer对象的引用,所以通过new关键字生成的Integer变量是不相等的,如下:
package com.java.basic;
public class UseInteger {
public static void main(String[] args) {
Integer i = new Integer(100);
//i内存地址为460141958
System.out.println(System.identityHashCode(i));
Integer j = new Integer(100);
//j的内存地址为1163157884
System.out.println(System.identityHashCode(j));
System.out.print(i == j); //false
}
}
(2)Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true,因为Integer会自动拆包为int,就相当于两个int相比较。
package com.java.basic;
public class UseInteger {
public static void main(String[] args) {
Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true
}
}
(3)非new生成的Integer变量且数据范围在-128-127之间,与new Integer()生成的对象比较时,如下:
package com.java.basic;
public class UseInteger {
public static void main(String[] args) {
Integer i = new Integer(100);
//i内存地址为460141958
System.out.println(System.identityHashCode(i));
int a = 100;
//a内存地址为1163157884
System.out.println(System.identityHashCode(a));
Integer j = 100;
//j的内存地址为1163157884
System.out.println(System.identityHashCode(j));
System.out.print(i == j); //false
}
}
因为在数据范围在-128-127之间时,非new生成的Integer生成的对象会指向常量池中的数据,所以与new Integer生成的对象内存地址不同,两者不相等。
(4)非new生成的Integer变量且数据范围为-128-127之外,与非new生成的Integer变量比较时,如下:
package com.java.basic;
public class UseInteger {
public static void main(String[] args) {
int a = 129;
//a内存地址为460141958
System.out.println(System.identityHashCode(a));
Integer i = 129;
//i内存地址为1163157884
System.out.println(System.identityHashCode(i));
Integer j = 129;
//j的内存地址为1956725890
System.out.println(System.identityHashCode(j));
System.out.print(i == j); //false
}
}
因为在-128-127范围之外的数据,不会被自动加入到常量池中,所以非new生成的Integer变量相当于new Integer(),内存地址不同故不相等。
7、参考链接
JAVA常量池,一篇文章就足够入门了。(https://blog.csdn.net/qq_41376740/article/details/80338158)
Java基础之int和Integer有什么区别https://blog.csdn.net/chenliguan/article/details/53888018)