我正在参加「掘金·启航计划」
一、基本数据类型
Java的基本数据类型有8种,分别是:byte(位)、short(短整数)、int(整数)、long(长整数)、float(单精度)、double(双精度)、char(字符)和boolean(布尔值)。
` ``System.out.println(``"byte的大小:"``+Byte.SIZE`
` ``+``";默认值:"``+b`
` ``+``";数据范围:"``+Byte.MIN_VALUE+``" - "``+Byte.MAX_VALUE);`
` ``System.out.println(``"short的大小:"``+Short.SIZE`
` ``+``";默认值:"``+s`
` ``+``";数据范围:"``+Short.MIN_VALUE+``" - "``+Short.MAX_VALUE);`
` ``System.out.println(``"int的大小:"``+Integer.SIZE`
` ``+``";默认值:"``+i`
` ``+``";数据范围:"``+Integer.MIN_VALUE+``" - "``+Integer.MAX_VALUE);`
` ``System.out.println(``"long的大小:"``+Long.SIZE`
` ``+``";默认值:"``+l`
` ``+``";数据范围:"``+Long.MIN_VALUE+``" - "``+Long.MAX_VALUE);`
` ``System.out.println(``"float的大小:"``+Float.SIZE`
` ``+``";默认值:"``+f`
` ``+``";数据范围:"``+Float.MIN_VALUE+``" - "``+Float.MAX_VALUE);`
` ``System.out.println(``"double的大小:"``+Double.SIZE`
` ``+``";默认值:"``+d`
` ``+``";数据范围:"``+Double.MIN_VALUE+``" - "``+Double.MAX_VALUE);`
` ``System.out.println(``"char的大小:"``+Character.SIZE`
` ``+``";默认值:"``+c`
` ``+``";数据范围:"``+Character.MIN_VALUE+``" - "``+Character.MAX_VALUE);`
` ``System.out.println(``"boolean的大小:"``+Byte.SIZE`
` ``+``";默认值:"``+bo`
` ``+``";数据范围:"``+Byte.MIN_VALUE+``" - "``+Byte.MAX_VALUE);`
二、包装类
1.java中为8种基本数据类型又对应准备了8种包装类。8种包装类属于引用数据类型,父类是Object。 8种基本数据类型对应的包装类型名
三、区别
1、包装类型可以为 null,而基本类型不可以
别小看这一点区别,它使得包装类型可以应用于 POJO 中,而基本类型则不行。 那为什么 POJO 的属性必须要用包装类型呢? 数据库的查询结果可能是 null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型,比如说把 Integer 对象转换成 int 值),就会抛出 NullPointerException 的异常。
2、包装类型可用于泛型,而基本类型不可以
泛型不能使用基本类型,因为使用基本类型时会编译出错。
List<int> list = new ArrayList<>(); // 提示 Syntax error, insert "Dimensions" to complete ReferenceType
List<Integer> list = new ArrayList<>();
为什么呢?因为泛型在编译时会进行类型擦除,最后只保留原始类型,而原始类型只能是 Object 类及其子类——基本类型是个特例。
3、基本类型比包装类型更高效
基本类型在栈中直接存储的具体数值,而包装类型则存储的是堆中的引用。
很显然,相比较于基本类型而言,包装类型需要占用更多的内存空间。假如没有基本类型的话,对于数值这类经常使用到的数据来说,每次都要通过 new 一个包装类型就显得非常笨重。
4、两个包装类型的值可以相同,但却不相等
两个包装类型的值可以相同,但却不相等——这句话怎么理解呢?来看一段代码就明明白白了。
Integer chenmo = new Integer(10);
Integer wanger = new Integer(10);
System.out.println(chenmo == wanger); // false
System.out.println(chenmo.equals(wanger )); // true
两个包装类型在使用“”进行判断的时候,判断的是其指向的地址是否相等。chenmo 和 wanger 两个变量使用了 new 关键字,导致它们在“”的时候输出了 false。
而 chenmo.equals(wanger) 的输出结果为 true,是因为 equals 方法内部比较的是两个 int 值是否相等。源码如下。
private final int value;
public int intValue() {
return value;
}
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
虽然 chenmo 和 wanger 的值都是 10,但他们并不相等。换句话说就是:将“==”操作符应用于包装类型比较的时候,其结果很可能会和预期的不符。