一般地,当需要使用数字的时候,我们通常使用内置数据类型,如:byte、int、long、double 等。然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。所以Java语言预定义了8种包装类型:
byte -> Byte
short -> Short
int -> Integer
long -> Long
float -> Float
double -> Double
char -> Character
boolean -> Boolean
例如:
Integer.toBinaryString()可得到一个整数的二进制代码
Integer.toHexString()可得到一个整数的十六进制代码
Integer.parseInt()可将一个String转换成int
Integer.toString()可将一个int转换成String
字符串和数值类型的转换
字符串 -> 数值: XXX.parseXXX(), 如Integer.parseInt()
数值 -> 字符串: toString(), String.valueOf()
java中的自动装箱与拆箱
/**
* @author YY哥哥
* java中的自动装箱与拆箱
* 简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
*/
public class TestDemo {
public static void main(String[] args) {
/**
Integer x= 128; // 装箱,相当于 Integer.valueOf(128);
int y = x; //相当于 x.intValue() 拆箱
System.out.println(y);
*/
/**
对于–128到127(默认是127)之间的值,被装箱后,会被放在内存里进行重用
但是如果超出了这个值,系统会重新new 一个对象
*/
Integer x = 200;
Integer y = 200;
/**
注意 == 与 equals的区别
== 它比较的是对象的地址
equals 比较的是对象的内容
*/
if(x==y) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}
Java 会对 -128 ~ 127 的整数进行缓存,所以当定义两个变量初始化值位于 -128 ~ 127 之间时,两个变量使用了同一地址:
Integer a=123;
Integer b=123;
System.out.println(a==b); // 输出 true
System.out.println(a.equals(b)); // 输出 true
当两个 Integer 变量的数值超出 -128 ~ 127 范围时, 变量使用了不同地址:
a=1230;
b=1230;
System.out.println(a==b); // 输出 false
System.out.println(a.equals(b)); // 输出 true
Java 中 int 和 Integer 的区别
1. int 是基本数据类型,int 变量存储的是数值。Integer 是引用类型,实际是一个对象,Integer 存储的是引用对象的地址。
Integer x = new Integer(100);
Integer y = new Integer(100);
System.out.print(x == y); //false
解释:因为 new 生成的是两个对象,其内存地址不同。
2. int 和 Integer 所占内存比较:
Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
3. 非 new 生成的 Integer 变量与 new Integer() 生成的变量比较,结果为 false。
/**
* 比较非new生成的Integer变量与new生成的Integer变量
*/
public class TestDemo {
public static void main(String[] args) {
Integer i= new Integer(200);
Integer j = 200;
System.out.print(i == j);
//输出:false
}
}
解释:非 new 生成的 Integer 变量指向的是 java 常量池中的对象,而 new Integer() 生成的变量指向堆中新建的对象,两者在内存中的地址不同。所以输出为 false。
4. 两个非 new 生成的 Integer 对象进行比较,如果两个变量的值在区间 [-128,127] 之间,比较结果为 true;否则,结果为 false。
/**
* 比较两个非new生成的Integer变量
*/
public class TestDemo {
public static void main(String[] args) {
Integer x1 = 127;
Integer y1 = 127;
System.out.println(x1 == y1);//输出:true
Integer x2 = 128;
Integer y2 = 128;
System.out.println(x2 == y2);//输出:false
}
}
解释:java 在编译 Integer x1 = 127 时,会翻译成 Integer x1 = Integer.valueOf(127)。
5. Integer 变量(无论是否是 new 生成的)与 int 变量比较,只要两个变量的值是相等的,结果都为 true。
/**
* 比较Integer变量与int变量
*/
public class TestDemo {
public static void main(String[] args) {
Integer x1 = 200;
Integer x2 = new Integer(200);
int y = 200;
System.out.println(x1 == y);//输出:true
System.out.println(x2 == y);//输出:true
}
}
解释:包装类 Integer 变量在与基本数据类型 int 变量比较时,Integer 会自动拆包装为 int,然后进行比较,实际上就是两个 int 变量进行比较,值相等,所以为 true。