java基本数据类型

目录

一.基本数据类型

1.整型变量

(1)整型变量

(2)长整型变量

(3)短整型变量

(4)字节型变量

2.浮点型变量

(1)双精度浮点型

(2)单精度浮点型

3.字符型变量

(1)字符型

4.布尔型变量

(1)布尔型

二.类型提升

三.类型转换


java的数据类型大体上和c语言的差不多,但是也有新添或者部分不同的地方。

Java 中的基本数据类型分为四类共八种,分别是整数类型、浮点类型、字符类型和布尔类型。每种基本数据类型都具有固定的大小和默认值。

这里做一个表格方便大家参考:

|--------|---------|------|------------------------|-----------|
| 数据类型 | 关键字 | 字节大小 | 取值范围 | 默认值 |
| 字节型 | byte | 1字节 | -128 ~ 127 | 0 |
| 短整型 | short | 2字节 | -32768 ~ 32767 | 0 |
| 整型 | int | 4字节 | -2^31 到 2^31-1 | 0 |
| 长整型 | long | 8字节 | -2^63 到 2^63-1 | 0L |
| 单精度浮点数 | float | 4字节 | 大约 3.4e−038 到 3.4e+038 | 0.0f |
| 双精度浮点数 | double | 8字节 | 大约 1.7e−308 到 1.7e+308 | 0.0d |
| 字符型 | char | 2字节 | 0 ~ 65535 | '\u0000' |
| 布尔型 | boolean | 未固定 | true 和 false | false |


对于以下的数据类型来说:

1.在main方法中定义变量没有初始化的话,他是没有初始值的,是不能够直接访问的。

**2.**但是在类里面main方法外面定义变量没有初始化的话,他是默认有一个初始值的,可以直接访问。

如:

java 复制代码
public class Test {
    int b;
    public void print(){
        System.out.println(b);// b没初始化一样可以访问
    }
    public static void main(String[] args) {
        Test test=new Test();
        test.print();
//        int a;
//        System.out.println(a);
    }
}

Error:变量"a"可能尚未初始化(红色)

一.基本数据类型

1.整型变量

(1)整型变量

  • 大小:4 字节(32 位)
  • 取值范围:-2,147,483,6482,147,483,647(即 -2^31 到 2^31-1)
  • 默认值:0
  • 用途:最常用的整数类型,用于大多数场合的整数运算。

对于整型来说,比较需要注意的就是避免溢出:

下面是一个例子:

java 复制代码
import java.lang.management.MonitorInfo;

public class Test {
    public static void main(String[] args) {
        System.out.println(Integer.MIN_VALUE);
        System.out.println(Integer.MAX_VALUE);
        int num = 2147483647;  // 最大值
        num += 1;  // 这会导致溢出
        System.out.println("加一后的数为: " + num);  // 输出: -2147483648 (溢出)

        int safeNum = Math.addExact(2147483647, 1);  // 通过标准库避免溢出,会抛出异常
    }
}

结果为(如果没有int safeNum = Math.addExact(2147483647, 1);这一句不会报错,就没有红色字体部分):

(2)长整型变量

  • 大小:8 字节(64 位)
  • 取值范围:-9,223,372,036,854,775,8089,223,372,036,854,775,807(即 -2^63 到 2^63-1)
  • 默认值:0L
  • 用途:用于处理比 int 类型更大的整数运算,适合需要存储非常大的整数的场景。

注意事项:

  • 用于存储非常大的整数,范围比 int 大得多。
  • 赋值时常需要在数值后面加上 L(当然也可以小写l),否则会被视为 int 类型。

例子如下:

java 复制代码
import java.lang.management.MonitorInfo;

public class Test {
    public static void main(String[] args) {
        System.out.println(Long.MIN_VALUE);  //long最大值
        System.out.println(Long.MAX_VALUE);  //long最小值
        
        long largeNumber = 9223372036854775807L;  // 最大值
        long minimumNumber=-9223372036854775808L;
        long largeNumber1 = 9223372036854775807l; //小写l
//        long minimumNumber1=-9223372036854775808; //(没加L)Error:Integer number too large
        
        System.out.println("Large Number: " + largeNumber);
        System.out.println("Minimum Number: "+minimumNumber);
        //long invalidNumber = 9223372036854775808L;  // 编译错误,超出范围
    }
}

(3)短整型变量

  • 大小:2 字节(16 位)
  • 取值范围:-32,76832,767(即 -2^15 到 2^15-1)
  • 默认值:0
  • 用途:比 byte 容量大一些,可以处理更大的整数,但仍然用于节省内存。

注意事项:

  • 范围在 -32,76832,767 之间,适用于比 byte 更大的整数场合。
  • 通常用的场景不多,因为 int 已经是常规选项。

例子如下:

java 复制代码
public class Test {
    public static void main(String[] args) {
        System.out.println(Short.MIN_VALUE); //short最小值
        System.out.println(Short.MAX_VALUE); //short最大值
        
        short s1 = 32767;  // 最大值
        short s2 = -32768; // 最小值
        //short s3 = 32768;  // 编译错误,超出范围

        System.out.println("s1: " + s1);  // 输出: 32767
        System.out.println("s2: " + s2);  // 输出: -32768
    }
}

(4)字节型变量

  • 大小:1 字节(8 位)
  • 取值范围:-128127(即 -2^7 到 2^7-1)
  • 默认值:0
  • 用途:用于节省内存空间的场合,尤其是在大量数据处理时。由于占用字节最少,适合处理小范围的数值。

注意事项:

  • 取值范围-128127,超出该范围会发生溢出。
  • 内存占用1 字节,用于节省空间。
  • 用途:适用于需要处理大量数据但内存有限的场景,如处理二进制数据。
  • 溢出处理:进行位运算时要小心,防止溢出,比如进行加法时可能会超出最大值。

例子如下:

java 复制代码
import java.lang.management.MonitorInfo;

public class Test {
    public static void main(String[] args) {
        System.out.println(Byte.MIN_VALUE); //byte最小值
        System.out.println(Byte.MAX_VALUE); //byte最大值

        byte a = 127; // 最大值
        byte b = -128; // 最小值
        System.out.println(a); // 输出 127
        System.out.println(b); // 输出 -128

        // 溢出示例
        byte c = (byte) (a + 1); // 溢出,结果为 -128
        System.out.println(c); // 输出 -128
    }
}

2.浮点型变量

(1)双精度浮点型

  • 大小:8 字节(64 位)
  • 精度:约 15 位有效数字
  • 默认的浮点数类型,常用于高精度运算。
  • 精度double 有 15-16 位有效数字,精度比 float 高。
  • 内存占用8 字节。
  • 用途:默认的浮点数类型,适用于需要较高精度的场景,如科学计算。
  • 字面量标识 :无需特殊标识,浮点数默认是 double,但为了表达意图明确,通常会在数值后加 dD,如 3.14d

例子如下:

java 复制代码
import java.lang.management.MonitorInfo;

public class Test {
    public static void main(String[] args) {
        System.out.println(Double.MIN_VALUE); // double最小值
        System.out.println(Double.MAX_VALUE); // double最大值

        double a = 3.14159265358979323846;
        System.out.println(a); // 输出 3.141592653589793

        // 精度问题(稍微更好,但仍有误差)
        double b = 1.1234567890123456789;
        System.out.println(b); // 输出 1.1234567890123457,精度丢失
    }
}

对此,在财务和涉及精确计算的工作中,通常不使用 floatdouble 数据类型。原因主要与 浮点数的精度问题舍入误差 有关。

(2)单精度浮点型

float

  • 大小:4 字节(32 位)
  • 精度:约 7 位有效数字
  • 用于表示单精度浮点数,常用于节省内存的场景。

注意事项:

  • 精度:浮点数只能精确到 6-7 位有效数字,无法表示精确的小数。
  • 内存占用4 字节。
  • 用途:适用于对内存要求严格且精度不太高的场景。
  • 字面量标识 :浮点数的字面量默认是 double 类型,使用 float 时需在数字后加上 fF,如 3.14f
  • 误差 :计算中可能会出现精度误差,尤其是在做金融等要求高精度的场景时,要避免使用 floatdouble

例子如下:

java 复制代码
import java.lang.management.MonitorInfo;

public class Test {
    public static void main(String[] args) {
        System.out.println(Float.MIN_VALUE); // double最小值
        System.out.println(Float.MAX_VALUE); // double最大值

        float a = 3.14f; // 注意加 'f' 表示 float 类型
//        float b=3.24;  //Error:Incompatible types. Found: 'double', required: 'float'
        System.out.println(a); // 输出 3.14

        // 精度问题
        float c = 1.123456789f; // 超过 7 位有效数字
        System.out.println(c); // 输出 1.1234568,精度丢失
    }
}

3.字符型变量

(1)字符型

  • 大小:2 字节(16 位)
  • 取值范围:0 到 65,535(即 Unicode 字符集)
  • 表示单个字符,如 'A''B' 或 Unicode 字符。char 实际上存储的是一个无符号的整数,表示对应的字符编码。

注意事项:

  • 字符编码char 在 Java 中使用 Unicode 编码,占用 2 字节,可以表示全球所有语言的字符。取值范围为 065,535
  • 字符常量 :字符常量使用单引号 括起来,如 'A'。它实际存储的是字符的 Unicode 编码值。
  • 强制转换char 可以和整数类型进行强制转换,比如将 char 转换为其对应的 Unicode 编码整数,或将整数转换为对应的字符。
  • 表示范围 :如果处理 ASCII 字符(如 A-Z,a-z,0-9),可以使用 char,否则要注意处理 Unicode 字符的情况。
  • 中文占用字节:在java中一个中文字符(汉字)通常占用 2 个字节

例子如下:

java 复制代码
import java.lang.management.MonitorInfo;

public class Test {
    public static void main(String[] args) {
        //这里的character表示char,但是这里打印结果会不可见,这是因为:
        /*Character.MIN_VALUE:表示最小的 char 值,等于 \u0000,即 Unicode 编码中的第一个字符(空字符)。
          Character.MAX_VALUE:表示最大的 char 值,等于 \uFFFF,即 Unicode 中的最后一个字符。*/
        System.out.println(Character.MIN_VALUE); // char最小值
        System.out.println(Character.MAX_VALUE); // char最大值

        char a = 'A'; // 使用单引号表示字符
        char b = 65; // 可以直接赋值为 Unicode 编码
        System.out.println(a); // 输出 A
        System.out.println(b); // 输出 A

        // Unicode 字符
        char c = '\u0041'; // Unicode 编码 A
        System.out.println(c); // 输出 A

        char d='帅';
//        char e='帅哥'; //Error:Too many characters in character literal
        System.out.println(d);
    }
}

对于中文占用字节数例子:

java 复制代码
public class Test {
    public static void main(String[] args) {
        String chineseCharacter = "汉";
        System.out.println("汉字: " + chineseCharacter);
        System.out.println("占用字节数: " + Character.BYTES); // 输出 2
    }
}

4.布尔型变量

(1)布尔型

  • 大小:1 位(通常表示为 1 或 0)
  • 取值范围:truefalse
  • 用于条件判断和控制流程。

注意事项:

  • 取值范围 :只包含两个值:truefalse
  • 内存占用:虽然布尔变量逻辑上只需要 1 位,但 JVM 实际可能会分配 1 字节或更多来存储它。
  • 用途 :常用于条件判断,布尔值无法与数字进行转换(例如 01 不会自动转换为 falsetrue)。
  • 逻辑运算 :常用逻辑运算符,如 &&(与),||(或),!(非)进行布尔运算。

例子如下:

java 复制代码
import java.lang.management.MonitorInfo;

public class Test {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        System.out.println(a); // 输出 true
        System.out.println(b); // 输出 false

        // 条件判断
        if (a) {
            System.out.println("a 是 true");
        } else {
            System.out.println("a 是 false");
        }
    }
}

二.类型提升

自动类型提升规则:

  • 小的整型会自动提升为 int

    • 所有的 byteshortchar 类型在表达式中都会被自动提升为 int
    • 如果表达式中有 long 类型的变量,int 也会被提升为 long
  • 浮点数的提升

    • 如果表达式中包含 floatdouble,那么 float 会自动提升为 double
  • 布尔类型没有提升

    • 布尔类型 boolean 不能参与类型提升,只能是 truefalse,不能和数字类型相互转换或提升。

举个例子:

java 复制代码
public class TypePromotion {
    public static void main(String[] args) {
        byte b = 10;
        char c = 'A';  // Unicode值 65
        int i = b + c; // 自动提升到 int 类型
        System.out.println(i);  // 输出 75

        int x = 10;
        long y = 100L;
        long z = x + y;  // x 自动提升为 long
        System.out.println(z);  // 输出 110

        float f = 3.14f;
        double d = 5.678;
        double result = f + d;  // f 自动提升为 double
        System.out.println(result);  // 输出 8.818
    }
}

结果为:

注意事项:

  • 自动类型提升遵循从低到高的顺序: byte -> short -> int -> long -> float -> double
  • 如果表达式中的任意一部分是 long,则整个表达式的结果会提升为 long 类型;同理,如果是 floatdouble,则最终结果会提升到相应类型。

**三.**类型转换

类型转换的两种情况:

  1. 自动转换(隐式转换)

    • 从较低精度的数据类型转换为较高精度的数据类型时,可以隐式转换。例如,从 int 转换为 long,从 float 转换为 double
  2. 强制转换(显式转换)

    • 从较高精度的数据类型转换为较低精度的数据类型时,需要进行显式类型转换。这可能会导致精度损失或溢出。

说再多都不如一个例子来的更明白:

java 复制代码
public class TypeCasting {
    public static void main(String[] args) {
        // 隐式转换 (自动转换)
        int i = 100;
        long l = i;  // int 自动转换为 long
        System.out.println(l);  // 输出 100

        float f = i;  // int 自动转换为 float
        System.out.println(f);  // 输出 100.0

        // 显式转换 (强制转换)
        double d = 9.99;
        int x = (int) d;  // double 强制转换为 int,精度损失
        System.out.println(x);  // 输出 9

        long y = 10000000000L;
        int z = (int) y;  // long 强制转换为 int,可能溢出
        System.out.println(z);  // 结果可能不是预期的,输出 -727379968
    }
}

结果:

注意事项:

  • 精度损失

    • 在进行浮点数到整数的强制类型转换时,小数部分会被截断,不进行四舍五入。例如,(int) 9.99 的结果是 9
  • 溢出问题

    • 当较大的数据类型转换为较小的类型时,如果超出了目标类型的表示范围,可能会发生溢出,导致值不准确。例如,long 转换为 int 时,如果超出 int 的范围,结果将出现意外行为。
  • 字符到整数的转换

    • char 可以隐式转换为 int,因为每个字符都有一个对应的 Unicode 值。
相关推荐
咸鱼鱼不翻身1 分钟前
Java面试题库——MySQL
java·mysql·面试
昨天今天明天好多天1 分钟前
【Mac】Python 环境管理工具
开发语言·python·macos
西瓜本瓜@9 分钟前
在Android开发中实现静默拍视频
android·java·开发语言·学习·音视频
_.Switch14 分钟前
高效网络自动化:Python在网络基础中的应用
运维·开发语言·网络·python·数据分析·自动化
2301_80220193关注我17 分钟前
Parameters参数、增删改标签、事务、typeAliases
java·数据库·windows
清灵xmf22 分钟前
JavaScript 中如何识别异步函数?
开发语言·javascript·async·异步函数
听潮阁37 分钟前
【SSM详细教程】-13-SpringMVC详解
java·spring boot·spring·java-ee·tomcat·maven·mybatis
七月巫山晴39 分钟前
QChart中柱形图的简单使用并实现【Qt】
开发语言·数据结构·c++·qt·算法·排序算法
阿丁小哥41 分钟前
【Python各个击破】numpy
开发语言·python·numpy