java基本数据类型

ops/2024/10/21 3:22:09/

目录

一.基本数据类型

1.整型变量

(1)整型变量

(2)长整型变量

(3)短整型变量

(4)字节型变量

2.浮点型变量

(1)双精度浮点型

(2)单精度浮点型

3.字符型变量

(1)字符型

4.布尔型变量

(1)布尔型

二.类型提升

三.类型转换


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

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

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

数据类型关键字字节大小取值范围默认值
字节型byte1字节-128 ~ 1270
短整型short

2字节

-32768 ~ 327670
整型int4字节-2^31 到 2^31-10
长整型long

8字节

-2^63 到 2^63-10L
单精度浮点数float4字节大约 3.4e−038 到 3.4e+0380.0f
双精度浮点数double

8字节

大约 1.7e−308 到 1.7e+3080.0d
字符型char2字节0 ~ 65535'\u0000'
布尔型boolean未固定true 和 falsefalse

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

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 largeSystem.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);  // 输出: 32767System.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); // 输出 127System.out.println(b); // 输出 -128// 溢出示例byte c = (byte) (a + 1); // 溢出,结果为 -128System.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); // 输出 ASystem.out.println(b); // 输出 A// Unicode 字符char c = '\u0041'; // Unicode 编码 ASystem.out.println(c); // 输出 Achar d='帅';
//        char e='帅哥'; //Error:Too many characters in character literalSystem.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); // 输出 trueSystem.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值 65int i = b + c; // 自动提升到 int 类型System.out.println(i);  // 输出 75int x = 10;long y = 100L;long z = x + y;  // x 自动提升为 longSystem.out.println(z);  // 输出 110float f = 3.14f;double d = 5.678;double result = f + d;  // f 自动提升为 doubleSystem.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 自动转换为 longSystem.out.println(l);  // 输出 100float f = i;  // int 自动转换为 floatSystem.out.println(f);  // 输出 100.0// 显式转换 (强制转换)double d = 9.99;int x = (int) d;  // double 强制转换为 int,精度损失System.out.println(x);  // 输出 9long y = 10000000000L;int z = (int) y;  // long 强制转换为 int,可能溢出System.out.println(z);  // 结果可能不是预期的,输出 -727379968}
}

结果:

注意事项:

  • 精度损失

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

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

    • char 可以隐式转换为 int,因为每个字符都有一个对应的 Unicode 值。

http://www.ppmy.cn/ops/127164.html

相关文章

深入拆解TomcatJetty(二)

深入拆解Tomcat&Jetty(二) 专栏地址:https://time.geekbang.org/column/intro/100027701 1、Tomcat支持的IO模型和应用层协议 IO模型: NIO:非阻塞 I/O,采用 Java NIO 类库实现。NIO2:异…

【计算机网络 - 基础问题】每日 3 题(四十七)

✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…

Linux文件系统软硬链接

目录 一、认识硬件--磁盘--永久性存储介质 1.1磁盘的结构 1.2磁盘的存储构成 1.3磁盘的逻辑结构 二、文件系统 2.1文件系统的引入 2.2理解文件系统 2.3对文件增删查改的再理解 2.4如何理解“目录” 三、软硬链接 3.1软链接 3.2 硬链接 3.3ACM 一、认识硬件--磁盘--…

cmake Qt模板

一、常用模块 1. 构建完成后自动调用windeployqt打包 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILDCOMMAND "${QT_PATH}/bin/windeployqt.exe" "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.exe" )需要将QT_PATH设为Qt的安装目录。还可以用-…

【Golang】踩坑记录:make()创建引用类型,初始值是不是nil!!

文章目录 起因二、得记住的知识点1. make()切片,初始化了吗?2. make()切片不同长度容量,append时的差别3. 切片是指向数组的指针吗?4. 切片扩容时,重新分配内存,原切片的数据怎么办? 三、咳咳&a…

【论文阅读】03-Diffusion Models and Representation Learning: A Survey

Abstract(摘要) 扩散模型是各种视觉任务中流行的生成建模方法,引起了人们的广泛关注它们可以被认为是 自监督学习方法【通过数据本身的结构和特征来训练模型,而不是依赖外部标签】 的一个独特实例,因为它们独立于标签注…

博科测试IPO上市丨为行业提供智能测试综合解决方案

近年来,汽车制造、大型基础设施建设以及新能源开发等领域,对高精度、高效率的测试解决方案需求迫切。为推动行业发展,博科测试通过多年的技术积累以及自主创新,围绕伺服液压测试和汽车测试试验领域,积累了多项核心技术…

spring如何解决bean循环依赖的问题

1、概述 spring中,存在A依赖B,同时B又依赖A的情况,这种情况下,spring如何进行bean初始化呢? Service public class A {Autowiredprivate B b; }Service public class B {Autowiredprivate A a; } 本文来解释这个问题…