Java数据类型

写在最前面:文章仅为个人学习Java的一些知识整理,如有描述不合适的地方,欢迎各位朋友指正!

 Java数据类型的分类

一、基本数据类型

1.整型

(1)byte型:
  • 字节型;
  • 内存占用1个字节,即二进制形式有8位,第一个位置是符号位(放置这个二进制数的正负号的位置,一般正数的符号位为0,复数的符号位为1),除去符号位之后还剩下7个位置可以填0或1来表示该二进制数,故有
    • 最大的正数是 01111111(+127的补码),
    • 最小的负数是 10000000(-128的补码),

        即byte型的数据的数据范围是-128—127;

  • 使用场景:byte 类型在需要处理原始字节数据、节省内存空间、进行低级操作或者进行网络和文件传输时非常有用。
  • 代码示例:
    byte data = 50;

(2)short型
  • 短整型;
  • 内存占用2个字节,即二进制形式有8*2=16位,除去符号位之后还剩下15个位置可以填0或1来表示该二进制数,故有
    • 最大的正数是 011111111111111(+32767的补码),
    • 最小的负数是 1000000000000000(-32768的补码),

        即short型的数据的数据范围是-32768—32767;

  • 使用场景:整数处理可以直接使用 int 类型,但在需要显式控制内存使用、特定硬件支持、二进制数据处理或与底层系统交互的情况下,可以将数据类型设置为short型。
  • 代码示例:
    short value = 1000;

(3)int型
  • 整型;
  • 一般说一个数据是整型时,在没有特别说明的情况下,默认该数据是int型的数据;
  • 内存占用4个字节,即二进制形式有8*4=32位,除去符号位之后还剩下31个位置可以填0或1来表示该二进制数,故有
    • 最大的正数是 011……11(一共31个1)((2^31) - 1的补码),
    • 最小的负数是 100……00(一共31个0)(-2^31的补码),

        即int型的数据的数据范围是-2^31—(2^31) - 1;

  • int 类型适用于大多数整数操作和数据表示场景,提供了合理的精度和范围,而且在大多数编程语言中都是默认的整数类型。
  • 代码示例:
    int num = 1;
(4)long型
  • 长整型;
  • 内存占用8个字节,即二进制形式有8*8=64位,除去符号位之后还剩下63个位置可以填0或1来表示该二进制数,故有
    • 最大的正数是 011……11(63个1)((2^63) - 1的补码),
    • 最小的负数是 100……00(63个0)(-2^63的补码),

        即long型的数据的数据范围是-2^63—(2^63) - 1;

  • long 类型通常用于需要更大范围整数值的场合。当 int 类型的范围不足以存储所需的整数值时,可以选择使用 long 类型。
  • 代码示例:
long num = 1234567890L; // 注意要在长整型数字后面加上L作为标志

2.浮点型

(1)float型
  • 单精度浮点数;
  • 内存占用4个字节,通常能够保存大约6到7位有效数字,一般不关注其取值范围;
  • 单精度浮点数在内存中占用较少空间,适合用于需要节省内存或者对精度要求不高的计算。例如,科学计算、图形处理、物理模拟等。
  • 注意区分double和float类型的数据的初始化的写法:
  • 
    //在赋值的时候需要在数字后面加上 f 或 F,以告知编译器这是一个 float 类型的数值。
    
    float a = 1.0f;//也可以写作1.0F
    
    float b = 3.14159f//在6-7为小数点的范围内的数据都可以定义为float类型得数据,
    
    //但是具体是定义为float类型还是double类型要看数据的具体使用场景

    扩展:若有一float 类型的变量,想要将其保留n位小数并输出(n小于等于6或7),如想将该float类型的数据保留5位小数输出,则有以下两种常用方法:

  • 法一:使用 String.format方法

public class FloatFormattingExample {
    public static void main(String[] args) {
        float floatValue = 3.21223f;
        // 使用 String.format 方法格式化 float 值,保留五位小数
        String formattedFloat = String.format("%.5f", floatValue);
        //这里可以直接参照"%.nf"即可,其中n为要保留的小数位数,且n不大于6或7
        // 输出格式化后的字符串
        System.out.println("Formatted float value: " + formattedFloat);
    }
}
  • 法二:使用 DecimalFormat类

    import java.text.DecimalFormat;
    
    public class FloatFormattingExample {
        public static void main(String[] args) {
            float floatValue = 3.21223f;
    
            // 创建一个 DecimalFormat 对象,指定保留五位小数的格式
            DecimalFormat df = new DecimalFormat("#.#####");
            //此处#是专门用来代表数字的符号小数点后要保留n位小数,就在小数点后面写n个#即可
    
            // 使用 DecimalFormat 格式化 float 值并转换为字符串
            String formattedFloat = df.format(floatValue);
    
            // 输出格式化后的字符串
            System.out.println("Formatted float value: " + formattedFloat);
        }
    }

(2)double型
  • 双精度浮点数;
  • 一般情况下没有过多说明时,浮点型数据默认是double型的数据;
  • 内存占8个字节,通常能够保存约15到16位有效数字,一般不关注其取值范围;
  • 双精度浮点数提供更高的精度和范围,适合于需要更高精度计算的场合,例如财务计算、工程计算、大多数数值计算以及需要更高精度的科学计算。
double a = 1.0; 
// 注意:没有额外的标志符号,有几位小数就写几位小数就可以了,不用在小数后面加f或者F
double a = 1.00;//这样也行
double b = 3.14159;//这也行,不超过15或者16位小数即可
  •  扩展:要将一个9位小数的double类型的小数按6为小数输出的两种方法

  • String.format 方法

double num = 123.456789123; // 9位小数的示例数值

// 使用 String.format 方法进行格式化
String formatted = String.format("%.6f", num);
System.out.println(formatted); // 输出 123.456789
  •  DecimalFormat 类

java
import java.text.DecimalFormat;

double num = 123.456789123; // 9位小数的示例数值

// 创建 DecimalFormat 对象并指定格式
DecimalFormat df = new DecimalFormat("#.######");
String formatted = df.format(num);
System.out.println(formatted); // 输出 123.456789
3.字符型
char型
  • 字符型,表示单个字符,内存占2个字节;
  • char 通常用于处理文本数据和字符操作,比如存储和处理ASCII字符、进行字符的比较和操作等。例如,在字符串处理、文本分析和输入输出中经常会用到。
  • 注意:String也可以表示字符,但是String表示的是字符串,char表示的是单个字符,如
    char ch = 'a';//和C语言一样字符常量是使用单引号 ' ' 来表示
    
    String str = "abc";
    //字符串常量则使用双引号 " "
    //此处abc这个字符串常量是引用类型的字符串常量

4.布尔型
boolean型
  • 布尔型;
  • 官方没有明确规定boolean占几个字节,也没有专门用来处理boolean的字节码指令,在Oracle公司的虚拟机实现中,boolean占一个字节;
  • Java中boolean类型的变量取值只有true和flase两种类型,故“0为假,非零为真”这句话在Java中不适用;
  • boolean类型的数据和int型的数据不能相互转化,不存在1表示true,0表示false这种写法
  • boolean类型得数据在未初始化的情况下是存在默认值的,boolean类型的数据的默认值是false;
  • boolean型通常用于存储条件的真假状态和逻辑运算的结果,它用于控制流程和逻辑判断,例如条件语句的控制条件、循环的终止条件等。
boolean isTrue = true;
boolean isFalse = false;

5.数据类型转换

在Java中当参与运算数据不一致时,就会进行类型转换。Java中的数据类型转换分为两类:自动类型转换(隐式转换)和强制类型转换(显式转换)。

  • 自动类型转换:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。
    • 能实现自动类型转换的条件:从数据范围小的数据转换为数据类型范围大的数据时会自动进行数据类型转换。
    • 代码示例:
      public class AutomaticTypeConversion {
      
          public static void main(String[] args) {
              // 自动类型转换示例
              int numInt = 100;
              long numLong = numInt; // int类型自动转换为long类型
      
              float numFloat = numLong; // long类型自动转换为float类型
      
              double numDouble = numFloat; // float类型自动转换为double类型
      
              System.out.println("int值: " + numInt);
              System.out.println("long值: " + numLong);
              System.out.println("float值: " + numFloat);
              System.out.println("double值: " + numDouble);
          }
      }

    • numLong 是一个 long 类型的变量,将 numInt 赋值给它。由于 long 的范围比 int 大,因此可以自动进行类型转换。
    • 从数据范围的角度来看,long类型的范围确实比float类型的范围要小。尽管long类型的表示范围更广,但float类型的精度更高,可以表示更大的数值范围和更小的小数值。故numLong可以向numFloat进行数据类型转换。

    • 同上,double 类型的数据能表示的数据精度高于float类型的数据,故float 类型也可以自动转换为 double 类型。

  • 强制类型转换:代码需要经过一定的格式处理,否则不能完成。
    • 一般进行强制数据类型转换的数据是从数据范围大的转换为数据范围小的数据,并且可能会出现数据精度丢失
       // 整数类型之间的转换
              int intValue = 100;
              byte byteValue = (byte) intValue; // 强制转换为byte
      
              // 浮点数类型之间的转换
              double doubleValue = 1234.567;
              float floatValue = (float) doubleValue; // 强制转换为float
      
              // 字符类型与整数类型的转换
              char charValue = 'A';
              int intValueFromChar = (int) charValue; // 强制转换char为int
      
              // 输出转换结果
              System.out.println("int -> byte: " + byteValue);
              System.out.println("double -> float: " + floatValue);
              System.out.println("char -> int: " + intValueFromChar);

  • 类型提升:当不同类型的数据进行运算(比如算术运算、赋值运算等)时,数据类型较小的会自动提升到较大的数据类型,以便保持精度和避免数据丢失。
    • 类型提升的规则:
      • 赋值操作中的类型提升
        • 当将一个较小的数据类型的值赋给一个较大数据类型的变量时,会发生自动类型提升(即自动类型转换)。
      • 整数类型提升规则
        • 如果两个操作数中有一个是 long 类型,则另一个操作数会被提升为 long 类型。
          int a = 10;
          long b = 20;
          //int c = a + b;这句会编译错误
          long d = a + b;

          int类型的数据是小范围的数据,在和long类型的数据相加时会自动转化为long类型的数据之后在跟b相加,a和b相加的结果也是一个long类型的数据,所以d应该定义为long类型的数据。

      • 浮点数类型提升规则
        • 如果一个操作数是 double 类型,则另一个操作数会被提升为 double 类型。
          int intValue = 10;
          double doubleValue = 20.5;
          // 如果一个操作数是 double 类型,则另一个操作数会被提升为 double 类型
          double result = intValue + doubleValue;
          System.out.println("Result: " + result); 
          // 输出 30.5,int 值 10 被提升为 double 类型,然后与 doubleValue 相加得到 30.5
        • 如果其中一个操作数是 float 类型,则另一个操作数会被提升为 float 类型。
          int intValue = 10;
          float floatValue = 20.5f;
          // 如果一个操作数是 float 类型,则另一个操作数会被提升为 float 类型
          float result = intValue + floatValue;
          System.out.println("Result: " + result); 
          // 输出 30.5,int 值 10 被提升为 float 类型,然后与 floatValue 相加得到 30.5

      • 比4个字节小的类型的数据类型提升:计算机的CPU是按照4个字节为单位从内存中读写数据的,为了方便硬件上的实现,byte、short、char会提升成int类型的数据参与计算,故计算结束之后的结果是int型的数据,想要便会之前的数据就要进行数据类型转换
        byte a = 10;
        byte b = 20;
        byte c = (byte)(a + b);
        System.out.println(c);

二、引用数据类型

在Java中,引用数据类型是指那些不直接包含基本数据值,而是引用对象地址的数据类型。

在Java中主要的引用数据类型主要有以下几种:

1.类(Class)类型

  • 所有的类都是引用数据类型。在Java中,类是通过关键字 class 定义的,它们可以包含字段(属性)和方法。类的实例化(创建对象)会产生一个引用,该引用指向在堆内存中分配的对象。
  • 代码示例:
class MyClass {
    // 类的定义
}

MyClass obj = new MyClass();  // obj 是一个 MyClass 类型的引用变量

​

2.接口(Interface)类型

  • 接口也是引用数据类型。接口定义了一组抽象的方法,类通过实现接口来提供方法的具体实现。接口类型的引用可以指向实现该接口的任何类的对象。
  • 代码示例:
interface MyInterface {
    // 接口定义
}

class MyClass implements MyInterface {
    // 类实现接口
}

MyInterface obj = new MyClass();  // obj 是一个 MyInterface 类型的引用变量

3.枚举(Enum)类型

  • 枚举类型定义了一个枚举集合,通过关键字 enum 定义。每个枚举常量是一个单独的对象,枚举类型的引用可以指向任何一个枚举常量。
  • 代码示例:
enum Day {
    MONDAY, TUESDAY, WEDNESDAY;  // 枚举常量
}

Day today = Day.MONDAY;  // today 是一个 Day 类型的引用变量

4.数组(Array)类型:

  • 数组也是引用数据类型。数组是一种包含固定数量元素的有序集合,所有元素的数据类型必须相同。数组类型的变量存储的是指向数组对象的引用。
  • 代码示例:
enum Day {
    MONDAY, TUESDAY, WEDNESDAY;  // 枚举常量
}

Day today = Day.MONDAY;  // today 是一个 Day 类型的引用变量

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超爱小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值