Java分为两大数据类型:
基本数据类型、引用数据类型
(基本 数据类型不支持方法调用和访问属性)
| 基本类型 | 对应的包装类(位于java.lang包中) |
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
基本包装类型是引用数据类型,不是基本数据类型!!!
应用数据类型:数组、类、接口、枚举、注解
某些场景下不能使用基本数据类型,只能使用引用数据类型
1. 泛型里,只能使用引用数据类型,不能使用基本数据类型
List
2. 数据库里,如果一个数据没有值,默认是null,此时如果Java里使用的是int类型,会报错!
int x =null;报错 Integer x = null;不报错
3. 当需要一个Object[] 数组时,不能使用 基本数据类型数据,而要使用 引用数据类型数组
Object[] objects = new int[]{1,2,3}; 报错
Object[] objects = new Integer[]{1, 2, 3}; 不报错
2. 装箱、拆箱装箱: 基本数据类型包装成为 基本包装类型 int-->Integer
拆箱: 基本包装类型拆成 基本数据类型 Integer --> int
基本数据类型和引用数据类型的区别:
基本数据类型不能调用方法,也不能访问属性;
引用数据类型可以调用方法,访问属性
int x1 = 10;
Integer x2 = new Integer(x1); // 使用 Integer的构造方法创建一个 Integer类型的对象
Integer x3 = Integer.valueOf(x1); // 调用 Integer类的 valueOf()静态方法,将基本数据类型转换成为引用数据类型
Integer x4 = x1; // 最常用,自动装箱
System.out.println(x4.toString());
Integer y1 = 9;
int y2 = y1; // 自动拆箱
int y3 = y1.intValue(); // 调用 intValue()方法手动拆箱
int a = 8;
Object b = a; // 自动装箱和多态
int[] arr1 = new int[]{1, 2, 3}; // 数组也继承自Object
Object c = arr1; // 多态
Integer[] arr2 = new Integer[]{4, 5, 6};
Object d = arr2; // 多态
// objects是一个数组,数组里存储的都是 Object类型的对象
// Object[] objects = new int[]{1, 2, 3};
Object[] objects = new Integer[]{1, 2, 3};
3. 基本数据类型转换成为字符串
- 使用 + 将基本数据类型和字符串拼接,例如 String x = 1 + "";得到的结果x就是个字符串。
- 调用包装类的 toString 方法,例如 Integer a = 1; String b = a.toString();得到的结果是一个字符串。
- 调用String类的 valueOf 方法,例如String x = String.valueOf(1);得到的结果是一个字符串。
基本包装类型里基本上都有 parseXXX方法,将字符串转换成为指定的基本数据类型。
byte a = Byte.parseByte("34");
short b = Short.parseShort("45");
int c = Integer.parseInt("123");
long d = Long.parseLong("456");
float e = Float.parseFloat("2.18");
double f = Double.parseDouble("3.14");
boolean g = Boolean.parseBoolean("true");
注意:如果传入的字符串不是一个合法的基本数据类型,会抛出NumberFormatException 异常
5. 自动装箱和拆箱的注意事项:Integer是引用数据类型,引用数据类型支持 == 运算,所以两个 Integer做 == 运算,不会拆箱! 引用数据类型使用 == 比较的是 内存空间 整数如果在 [-128,127] 之间,在内存里有一个常量区,所有的 [-128,127] 之间的数字都指向这一块内存
public class BoxingDemo {
public static void main(String[] args) {
// Integer 是引用数据类型
Integer i1 = 5; // 自动装箱,把基本数据类型包装成为了引用数据类型
System.out.println(i1 + 3); // 自动拆箱,把引用数据类型拆成了基本数据类型然后做算术运算
Integer i2 = 7;
System.out.println(i1 > i2); // 把i1和i2拆箱变成基本数据类型比较
System.out.println(i1 < i2);
Integer i3 = 5;
// 对象之间使用==比较,比较的是地址
System.out.println(i1 == i3); // 不会拆箱,把i1和i3当做对象来比较
Person p1 = new Person("张三", 18, "男");
Person p2 = new Person("李四", 20, "女");
// System.out.println(p1 + 3);
// System.out.println(p1 > p2);
// System.out.println(p1 == p2);
Integer x = 300;
Integer y = 300;
System.out.println(x == y); // false
// 禁止 使用 == 对引用数据类型进行比较!!!
System.out.println(x.equals(y)); // true
Integer m = 3; // 装箱
// m += 2; // 拆箱 + 装箱
// m = Integer.valueOf(m.intValue() + 2);
}
}
6. 常见方法和属性
Integer里常见的方法和属性:
MIN_VALUE: int类型的最小值 -2的31次方
MAX_VALUE: int类型的最大值 2的31次方-1
实例方法,需要创建实例对象再使用
intValue(): 拆箱,把基本包装类型拆箱成为基本数据类型
静态方法,直接使用类名调用
把字符转换成为数字:
valueOf(int x)/valueOf(String s)/ valueOf(String s,int radix):
将int类型的值 装箱成为基本包装类型,也可以将字符串转换成为基本包装类型
radix 表示进制,取值范围是 [2,36]
parseInt(String s) / parseInt(String s,int radix):
将字符串转换成为int类型的值
valueOf和parseInt无论是什么进制的字符串都变成十进制
把数字转换成为字符串:
toBinaryString(int x) / toOctalString(int x) / toHexString(int x):
把整数转换成为 指定进制的字符串
int a = 45; String s = a + "";
public class BoxMethod {
public static void main(String[] args) {
Integer i = 15;
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
String s = "123"; // 把字符串转换成为数字
System.out.println(s + 1); // "1231"
int x = Integer.valueOf(s);
int a = Integer.valueOf("2b", 30);
System.out.println(a);
System.out.println(Integer.toBinaryString(34));
System.out.println(Integer.toOctalString(89));
System.out.println(Integer.toHexString(93));
int m = 56;
String s1 = m + ""; // 将数字转换成为字符串
}
}



