Java基础知识(一)——数据类型常见问题


1.基本数据类型

Java有8中基本数据类型,分别是:

  1. 6种数字类型:整型(byte、short、int、long)、浮点型(float、double)
  2. 1种字符类型:char
  3. 1种布尔型:boolean

1. 整型(4种)

类型 大小(字节) 取值范围 默认值 示例
byte 1字节 (8位) -128 到 127 0 byte b = 100;
short 2字节 (16位) -32,768 到 32,767 0 short s = 500;
int 4字节 (32位) -2³¹ 到 2³¹-1 (约 ±21亿) 0 int i = 100000;
long 8字节 (64位) -2⁶³ 到 2⁶³-1 0L long l = 10000000000L;(需加L后缀)

2. 浮点型(2种)

大小(字节) 精度 默认值 示例
float 4字节 (32位) 单精度(6-7位小数) 0.0f float f = 3.14f;(需加f后缀)
double 8字节 (64位) 双精度(15位小数) 0.0d double d = 3.1415926535;(可省略d

3. 字符型(1种)

类型 大小(字节) 取值范围 默认值 示例
char 2字节 (16位) Unicode字符(\u0000 到 \uffff) \u0000 char c = 'A';char c = '\u0041';

4. 布尔型(1种)

类型 大小(官方未明确定义) 取值 默认值 示例
boolean 通常1位或1字节 true/false false boolean flag = true;

2.包装类型

这8种类型对应的包装类型分别是:Byte、Short、Integer、Long、Float、Double、Character、Boolean

他们跟基本数据类型的区别是什么:

1.用途:除了一些局部变量和常量外,平时很少使用基本类型。一般方法的参数或者对象属性的类型,都会使用包装类型。包装类型可以用于泛型,基本类型不可以。

2.储存位置:基本数据类型的局部变量一般储存在Java虚拟机栈的局部变量表中,成员变量未被static修饰的,都放在Java虚拟机的堆中;而包装类型属于对象类型,实际上大多数对象类型的实例都被存放在Java虚拟机的堆中

3.占用空间:相比于包装类型,基本类型占用的空间一般都会小很多

4.默认值:包装类型的成员变量不赋值的话就是null;而基本类型都有默认值且不是null

5.比较方式:基本数据类型可以用 “==”来进行比较;而包装类型都是用equals()进行值比较,对象类型的“==”就是在比较这两个对象内存地址是不是相同。

注意:为什么说几乎所有对象的示例都放在堆中呢?因为在HotSpot虚拟机在引入JIT优化之后,会对对象进行逃逸分析,如果发现一个对象并没有逃逸到方法外部,就会进行标量替换,把对象分配到栈中,避免在堆上分配内存。

3.自动装拆箱

1.什么是自动装拆箱,原理是什么?

就是基本类型和包装类型相互转换。举例:

Integer num = 10;//装箱

int i = num; //拆箱

从他们的.class文件来看,num=10的地方用了Integer.valueof(10)方法,i=num的地方,用的是num.intValue()方法,也就是装箱使用的是包装类的valueOf()方法,拆箱就是使用的xxxvalue方法。

2.自动装箱拆箱引发的NPE的问题。

(1)在实体类中,比如TableA的属性Long trainerNum,然后我们使用 long trainer = a.getTrainerNum();在数据库中,这个trainerNum不是必填字段,他的默认值会是Null,然后在这里取trainer时会发生自动拆箱,这时候是Null的话,就会抛出NPE

(2)三目运算符使用不当出现的NPE

public class Main{
    public static void main(String [] args){
        Boolean condition = true;
        Integer a = null;
        System.out.println(condition?a:0);
    }
}

因为0是基本数据类型int,这里需要返回数据的时候,就需要把a强制拆箱成int,由于a是null,所以会抛出NPE。

《阿里巴巴开发手册》中也提到过这个问题:

image-20250709180619981


文章作者: HT
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HT !