基本数据类型
基本类型 | 位数 | 字节 | 默认值 | 取值范围 |
---|---|---|---|---|
byte | 8 | 1 | 0 | -128 ~ 127 |
short | 16 | 2 | 0 | -32768 ~ 32767 |
int | 32 | 4 | 0 | -2147483648 ~ 2147483647 |
long | 64 | 8 | 0L | -9223372036854775808 ~ 9223372036854775807 |
char | 16 | 2 | ‘u0000’ | 0 ~ 65535 |
float | 32 | 4 | 0f | 1.4E-45 ~ 3.4028235E38 |
double | 64 | 8 | 0d | 4.9E-324 ~ 1.7976931348623157E308 |
boolean | 1 | false | true、false |
包装数据类型
这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。
包装类型不赋值就是 Null ,而基本类型有默认值且不是 Null。
包装类型的常量缓存池
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。
数值比较的问题
基本数据类型和包装类进行比较规则
1、基本型和包装类进行“ == ”运算符的比较,包装类将会自动拆箱变为基本型后再进行比较,假设Integer(0)与 int a=0 比较,Integer(0)会自动拆箱为 int 类型再进行比较,显然返回 true,因为缓存池的缘故,会直接从缓存中拿出0和0进行比较;
2、两个 Integer 类型进行“= = ”比较, 如果其值在-128 至 127,那么返回true,否则返回 false, 因为值-128 至 127 是直接从高速缓存中拿的值。
3、两个包装类进行 equals()比较,首先 equals()会比较类型,如果类型相同, 则继续比较值,如果值也相同,返回 true。
4、包装类调用 equals(),但是括号中的参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行 3 中的比较。
自动装箱和自动拆箱
装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;
Integer i = 10 等价于 Integer i = Integer.valueOf(10)
int n = i 等价于 int n = i.intValue();
为什么要有包装类型
new对象就会在堆上分配空间,如果我们频繁的使用Integer和Byte对象的时候,这样就会频繁的访问堆空间,对垃圾回收机制会造成一定影响,影响了效率,基本数据类型只在栈上创建、使用以及销毁,提高了效率节省了空间
Java是面向对象的编程语言,为了让基本数据类型具有面向对象的特征,对其进行包装,使其具有面向对象的特征,具有属性和方法;并且在某些情况下,方法的参数必须是对象;其次包装类提供了更强大的方法;而且方便了其他对象与基本数据类型的转换
场景问题
使用交换函数交换两个基本数据类型
public static void main(String[] args) {
int num1 = 10;
int num2 = 12;
swap(num1,num2);
System.out.println(num1 + " " + num2);
}
public static void swap(int a,int b){
int temp = a;
a = b;
b = temp;
System.out.println(a + " " + b);
}
结果
12 10
10 12
也就是交换失败
交换包装数据类型
public static void main(String[] args) {
int num1 = 10;
int num2 = 12;
swap(num1,num2);
System.out.println(num1 + " " + num2);
}
public static void swap(Integer a,Integer b){
int temp = a;
a = b;
b = temp;
System.out.println(a + " " + b);
}
结果
12 10
10 12
交换失败
因为仅仅在交换范围内起作用,在主方法中还是没有交换的
public static void main(String[] args) {
int num1 = 129;
int num2 = 130;
int[] swap = swap(num1, num2);
num1 = swap[0];
num2 = swap[1];
System.out.println(num1 + " " + num2);
}
public static int[] swap(Integer a,Integer b){
int temp = a;
a = b;
b = temp;
System.out.println(a + " " + b);
return new int[]{a,b};
}
以返回值的方式进行返回,那么就可以交换成功
130 129
130 129