跳至主要內容

Java程序设计(基础)- 数据类型

bsfc.tech大约 4 分钟JavaJavaSE

Java基础程序设计

数据类型,分为两大类型:

  • 基本数据类型(普通的值)
    • 数值类型
      • 整数类型(byte、short、int、long)
      • 浮点类型(float、double)
    • 字符型(char)
    • 布尔型(boolean)
  • 引用数据类型(传递的内存地址)
    • 类(class)
    • 接口(interface)
    • 数组

一、Java基本数据类型

Java编程语言提供了八种基本数据类型,它们可以被划分为以下四类:

1. 整数类型

  • byte: 占用1字节,有符号整数,取值范围从 -128127
    byte smallNum = 0; // 默认值
    byte smallNum = 127;
    
  • short: 占用2字节,有符号整数,取值范围从 -32,76832,767
    short notSoSmall = 0; // 默认值
    short notSoSmall = 32767;
    
  • int: 占用4字节,有符号整数,默认整数类型,取值范围从 -2^312^31 - 1
    int normalInt = 0; // 默认值
    int normalInt = 2_147_483_647; // 注意Java允许下划线进行数字分隔以提高可读性
    
  • long: 占用8字节,有符号整数,需要在数值后添加Ll标识符,取值范围从 -2^632^63 - 1
    long largeNumber = 0L; // 默认值
    long largeNumber = 9_223_372_036_854_775_807L;
    

2. 浮点数类型

  • float: 占用4字节,单精度浮点数,取值范围较大但精度相对较低,常量后面需跟Ff标识符。
    float decimalValue = 0.0f; // 默认值
    float decimalValue = 3.1415926535f;
    
  • double: 占用8字节,双精度浮点数,这是Java默认的浮点数类型,具有更大的精度范围。
    double preciseDecimal = 0.0; // 默认值
    double preciseDecimal = 3.141592653589793;
    

3. 字符类型

  • char: 占用2字节,无符号Unicode字符,通常用单引号括起来。
    char letterA = ''; // 默认值 \u0000(空,'')
    char letterA = 'A';
    

4. 布尔类型

  • boolean: 表示逻辑值,仅能取两个值 truefalse
    boolean flag = false; // 默认值
    boolean flag = true;
    

此外,每个基本类型都有对应的包装类,例如 Byte, Short, Integer, Long, Float, Double, Character, 和 Boolean。基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。

Integer x = 1;     // 装箱
int y = x;         // 拆箱

对于数据来说,设置内容的时候应该放在整个允许的范围之中。如果超过了此范围,肯定会出现数值不正确的情况。 故在实际编程中,根据需要准确选择合适的数据类型是非常重要的。

❤️ 缓存池

在 Java 中,new Integer(0)Integer.valueOf(0) 都用于创建代表整数值 0 的 Integer 对象,但是它们之间有一个重要的性能和内存使用的区别:

  1. new Integer(0):

    • 这是通过调用 Integer 类的构造函数显式地创建一个新的 Integer 对象。
    • 每次执行 new Integer(0),都会在堆内存中创建一个新的对象实例。
    Integer a = new Integer(0);
    Integer b = new Integer(0);
    // a 和 b 是不同的对象,指向不同的内存地址
    System.out.println(a == b); // 输出: false
    
  2. Integer.valueOf(0):

    • 这是一个静态工厂方法,它会尝试从一个缓存池中获取对应整数值的对象引用。
    • 对于 -128127 这个范围内的整数值,Integer.valueOf() 方法会重用已经存在的对象,而不是每次都创建新的对象。
    • 因此,当连续两次调用 Integer.valueOf(0) 时,如果值在缓存范围内,实际上会返回相同的对象引用。
    Integer c = Integer.valueOf(0);
    Integer d = Integer.valueOf(0);
    // 如果是在缓存范围内(如0在这个范围内),c 和 d 指向的是同一个对象
    System.out.println(c == d); // 输出: true
    

总结起来,在处理小整数值时,Integer.valueOf() 能够提高效率并减少内存占用,因为它可能避免了不必要的对象创建。 而对于超出缓存范围的整数值,Integer.valueOf() 表现得与 new Integer() 相似,会创建新的对象实例。

提示

在 JDK 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很特殊,这个缓冲池的下界是 -128,上界默认是 127, 但是这个上界是可调的,在启动 JVM 的时候,通过 -XX:AutoBoxCacheMax=<size> 来指定这个缓冲池的大小, 该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界。

❤️ 数据类型的转换

  • 自动类型转换(条件皆成立)
    • 转换前的数据类型与转换后的类型兼容。
    • 转换后的数据类型表示范围比转换前的类型大。
  • 强制类型转换
    • 整数运算,结果也会是整数。

提示

任何类型的数据都向String转型。