01. Java 中的数据类型

数据类型

Java 是一门强语言,语言的数据类型分为:八种基本类型和三种引用类型(数组, class, interface)。在声明变量或常量时必须指定数据类型。

整数类型

Java 中整数类型都是有符号型。
整型分为int(默认), byte、short、int 和 long 四种类型,它们之间的区别仅仅是宽度和范围的不同。

  • byte 的范围 1 字节 -128 到 127
  • short 的范围 2 字节 -32768 到 32767
  • int 的范围 4 字节 -2147483648 到 2147483647(约 21 亿)
  • long 的范围 8 字节 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

为方便查看数值类型的最大和最小值, Java 提供了对应了静态成员变量。例如 Integer.MAX_VALUE 和 Integer.MIN_VALUE。

实型(小数类型 / 浮点型)

存储格式
浮点格式采用 阶码 + 尾码 的方式。

  • 浮点型常量后面加后缀修饰, Float 类型以 F/f 结尾,double 类型以 D/d 结尾。
  • 如果浮点常量不带后缀,则默认为双精度常量

二进制中为表示小数,也采用类似的科学表示法,形如 m×(2^e)。m 称为尾数,e 称为指数。指数可以为正,也可以为负,负的指数表示那些接近 0 的比较小的数。在二进制中,单独表示尾数部分和指数部分,另外还有一个符号位表示正负。几乎所有的硬件和编程语言表示小数的二进制格式都是一样的。这种格式是一个标准,叫做 IEEE 754 标准,它定义了两种格式:一种是32位的,对应于 Java 的 float;另一种是 64 位的,对应于 Java 的 double。

32 位格式中,1 位表示符号,23 位表示尾数,8 位表示指数。
64 位格式中,1 位表示符号,52 位表示尾数,11 位表示指数。

在两种格式中,除了表示正常的数,标准还规定了一些特殊的二进制形式表示一些特殊的值,比如负无穷、正无穷、0、NaN(非数值,比如 0 乘以无穷大)。IEEE 754 标准有一些复杂的细节,初次看上去难以理解,但也不常用。

1、Float:比特数为 32,数值范围为 -3.4E+38 ~ 3.4E+38
2、Double:比特数为 64,数值范围为 -1.7E-308~1.7E+308

// 三者都是一回事
double d = 1.23; // 浮点型常量默认为 double 类型
double d = 1.23d;
double d = 1.23D;

无论是使用 float 还是 double,进行运算时都会出现一些非常令人困惑的现象,比如 0.1f * 0.1的结果看上去应该是 0.01,但实际上,屏幕输出却是 0.010000001,后面多了个 1。

二进制是类似的,但二进制只能表示那些可以表述为 2 的多少次方和的数。为什么计算机中不能用我们熟悉的十进制呢?在最底层,计算机使用的电子元器件只能表示两个状态,通常是低压和高压,对应 0 和 1,使用二进制容易基于这些电子元器件构建硬件设备和进行运算。如果非要使用十进制,则这些硬件就会复杂很多,并且效率低下。
计算不精确,怎么办呢?大部分情况下,我们不需要那么高的精度,可以四舍五入,或者在输出的时候只保留固定个数的小数位。如果真的需要比较高的精度,一种方法是将小数转化为整数进行运算,运算结束后再转化为小数;另一种方法是使用十进制的数据类型,这个并没有统一的规范。在 Java 中是 BigDecimal,运算更准确,但效率比较低。

数字表示方式
不同的进制数

Java中对整型数据的表示有以下三种形式:

  • 二进制:数据以 0b0B 开头(jdk 1.7新增)。
  • 八进制:数据以 0 开头,例如:054012
  • 十六进制:数据以 0x0X 开头,例如:0x110xAD00

二进制写起来太长,为了简化写法,可以将 4 个二进制位简化为一个 0~15 的数, 10~15 用字符 A~F 表示,这种表示方法称为十六进制。

指数表示

进行数学计算时往往会用到指数表示的数值。如果采用十进制表示指数,需要使用大写或小写的 e 表示幂。

System.out.println(1e2);// 100.0
System.out.println(1e+2);// 100.0
System.out.println(1e-2);// 0.01
System.out.println(1E+1);// 10.0

在使用十六进制数的时候也是可以使用科学计数法,只是此种用法用得不多

// 表示十六进制12 乘以 (2 的 2次方) = 18 * 4 = 72
System.out.println(0x12P2);

在 Java SE 7 中,还支持以下划线作为分隔符联接的数值表示方式, 但是下划线不能放在首尾的位置

输出样例

System.out.println(123_456);
System.out.println(0B1111_1111);
System.out.println(3.141_592F);

字符类型

  • Java中 char 声明字符类型
  • 必须用单引号括起来的单个字符
  • 双字节国际统一标准 Unicode 编码,占两个字节(16 位),因而可用十六进制(无符号的)编码形式表示, 所以’A’字符也可以用 Unicode 编码 ‘\u0041’ 表示

提示 字符类型也属于是数值类型,可以与int 等数值类型进行数学计算或进行转换。这是因为字符类型在计算机中保存的是 Unicode 编码,双字节 Unicode 的字符范围:\u0000(即为 0)到 \uffff(即为 65,535)

在 Java 中,为了表示一些特殊字符,前面要加上反斜杠(\),这称为字符转义。

特殊字符
\u3000 表示一个中文空格。

布尔类型

在 Java 语言中声明布尔类型的关键字是 boolean,只有两个值:true 和 false。

各取值范围

变量

变量和常量是构成表达式的重要部分,变量所代表的内部是可以被修改的。

  • 一定要注意变量属于哪个类型和它的取值范围。
  • 强制类型转换(小能默认转大,大转小要用强转)。
  • 强转可以取某个实数的整数部分(int a = (int)12.34)。

方法内局部变量(自动变量)

  • 局部变量只定义在局部范围内,如:方法内,语句内等。
  • 局部变量存在于栈内存中。
  • 作用的范围结束,变量空间会自动释放。
  • 局部变量没有默认初始化值
  • 在方法体内可以定义本方法所使用的变量,这种变量是局部变量,它的生存期与作用域是在本方法内。
  • 方法体内定义变量时,变量前不能加修饰符
  • 局部变量在使用前必须明确赋值,因为它没有默认值,否则编译时会出错。
  • 在语句块中定义的变量它只在语句块中有效;
  • 方法参数:作用域是整个方法。
  • 异常处理参数: catch 跟随的异常处理块。

非静态成员变量

  • 定义在类中,在整个类中都可以被访问。
  • 成员变量随着对象的建立而建立,存在于对象所在的堆内存中。
  • 成员变量有默认初始化值。

静态成员变量(全局变量/类变量/静态成员变量)

在定义 class 时,作为成员变量且加了 static 关键字。

常量

在 Java 中,常量是一种在程序运行期间其值不会改变的变量。通常用来表示固定的、不可变的数据。

常量可以是整数、浮点数、字符、字符串等数据类型。为了表明一个变量是常量,需要在变量声明时使用 final 关键字。例如:

final int MAX_COUNT = 100;

在上面的例子中,MAX_COUNT就是一个常量,它的值被设定为 100,并且在程序运行过程中不能被修改。

常量的使用可以提高代码的可读性和可维护性,因为它们清晰地表明了一些固定的值,而且在需要更改这些值时也更容易进行管理。

字面量

字面量是指在编程语言中直接表示值的表达式。它是一个固定的值,不需要计算或解析。

在 Java 中,字面量可以是各种数据类型的具体值,比如整数字面量(如 123)、浮点数字面量(如 3.14)、字符字面量(如 ‘A’)、字符串字面量(如 “Hello, World!”)等。

数值类型相互转换

自动类型转换

自动类型转换就是需要类型之间转换是自动的,不需要采取其他手段,总的原则是小范围数据类型可以自动转换为大范围数据类型,列类型转换顺序如图所示,从左到右是自动。

注意 如图所示,char 类型比较特殊,char 自动转换为 int、long、float 和 double,但 byte 和 short 不能自动转换为 char,而且 char 也不能自动转换为 byte 或 short。

char 和 int 的码值对应,即 ASCII 码
0-9 48-57
A-Z 65-90
a-z 97-122

// 字符 转 int 属于自动升位, 不需要强转
int c = 'a';
// 输出'A'
System.out.println((char)(c - 32));

强制类型转换

在数值类型转换过程中,除了需要自动类型转换外,有时还需要强制类型转换,强制类型转换是在变量或常量之前加上“(目标类型)”实现。

参考

  • 丁振凡编著,《Java 语言程序设计(第 2 版)》华东交大版,2014.9
  • 免费公开课_传智播客和黑马程序员免费公开课 http://yun.itheima.com/open
  • Java 从小白到大牛-图书-图灵社区 http://www.ituring.com.cn/book/2480

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474105.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Oracle19C图形界面安装教程

文章目录 一、安装前的准备1、安装Linux操作系统2、配置网络源或者本地源3、hosts文件配置 二、Oracle19c安装过程1、安装相关软件:2、用户与组:3、修改内核参数:4、资源限制:5、配置用户环境变量:6、创建相关文件目录…

NASA数据集——2017-2019年阿拉斯加和加拿大北极地区RGB 合成图像V2(L1/L2数据集)

简介 ABoVE: Hyperspectral Imagery AVIRIS-NG, Alaskan and Canadian Arctic, 2017-2019 V2 高光谱成像 AVIRIS-NG,阿拉斯加和加拿大北极地区,2017-2019 V2 摘要 本数据集提供了机载可见光/红外成像分光计-下一代(AVIRIS-NG)…

用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理

1)用Compute Shader处理图像数据后在安卓机上不能正常显示渲染纹理 2)折叠屏适配问题 3)Prefab对DLL中脚本的引用丢失 4)如何优化Unity VolumeManager中的ReplaceData 这是第378篇UWA技术知识分享的推送,精选了UWA社区…

智慧公厕助力“厕所革命”,方便小事关乎文明大事

公共厕所是城市文明建设的重要组成部分,而智慧公厕则是厕所变革的一项全新举措。通过物联网、互联网、大数据、云计算、自动化控制技术的应用,智慧公厕实现了对公共厕所全方位的业务融合和智能化管理。下面将以智慧公厕源头实力厂家广州中期科技有限公司…

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结 模糊图像增强技术之去噪声类滤波场景应用小结—【蘇小沐】 文章目录 【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结(一)去噪声类滤波器1、去块滤波器(Deblo…

【WSL】Ubuntu 20.04 字符集不认识中文,及其中文路径

1. 问题 $ locale locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory LANGen_US.UTF-8 LANGUAGE LC_CTYPEUTF-8 LC_NUMERIC"en_US.UTF-8" LC_TIME"en_US.UT…

Flutter 3.13 之后如何监听 App 生命周期事件

在 Flutter 中,您可以监听多个生命周期事件来处理应用程序的不同状态,但今天我们将讨论 didChangeAppLifecycleState 事件。每当应用程序的生命周期状态发生变化时,就会触发此事件。可能的状态有 resumed 、 inactive 、 paused 、 detached …

idea 开发serlvet篮球秩序册管理系统idea开发mysql数据库web结构计算机java编程layUI框架开发

一、源码特点 idea开发 java servlet 篮球秩序册管理系统是一套完善的web设计系统mysql数据库 系统采用serlvetdaobean mvc 模式开发,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 servlet 篮…

PCL ICP配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、可视化代码四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统计的比较分析,为直…

MySQL数据库基本操作(增删改查)与用户授权

前言 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系数据库系统的语言。SQL的设计目标是提供一种简单、直观的语言,使得用户可以通过编写SQL语句来处理他们想要的数据和操作。 目录 一、结构介绍 1. 查看信…

【C语言】文件操作揭秘:C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】

欢迎来CILMY23的博客喔,本篇为【C语言】文件操作揭秘:C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】,感谢观看,支持的可以给个一键三连,点赞关注收藏。 前言 欢迎来到本篇博客&…

Mybatis之自定义映射resultMap

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

Qualcomm AI Hub-示例(三)模型推理

文章介绍 Qualcomm AI Hub提供了部署在云端边缘物理设备执行模型推理的任务,让你能够快速的评估在真实硬件上模型推理的精度和性能。本文介绍了如何使用AI Hub提供的接口在云端设备执行推理,更多详情可以参阅 Running Inference 模型推理 出于功耗和性能…

Rust Rocket简单入门

简介 Rust中最知名的两个web框架要数Rocket和Actix了,Rocket更注重易用性,Actix则更注重性能。这里只是了解一下Rust下的WebAPI开发流程,就学一下最简单的 Rocket。 Rocket 是一个用于 Rust 的异步 Web 框架,专注于可用性、安全性…

FreeRTOS教程9 软件定时器

目录 1、准备材料 2、学习目标 3、前提知识 3.1、软件定时器回调函数 3.2、软件定时器属性和状态 3.2.1、周期 3.2.2、分类 3.2.3、状态 3.3、软件定时器运行原理 3.3.1、RTOS 守护进程任务 3.3.2、定时器命令队列 3.3.3、守护进程任务调度 3.4、创建、启动软件定…

Web框架开发-Django模型层(数据库操作)

一、ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动ORM是“对象-关系-映…

ubuntu20.04安装Pycharm

下载pycharm安装包 https://www.jetbrains.com/pycharm/download/#sectionlinux 使用社区版点击download 下载好的pycharm如图所示,右键解压: 打开终端,输入cd命令,进入刚刚解压文件夹下的bin文件夹,命令行是cd 文…

手撕算法-二叉搜索树与双向链表

牛客BM30。 描述:https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId295&tqId23253&ru/exam/oj&qru/ta/format-top101/question-ranking&sourceUrl%2Fexam%2Foj分析:二叉搜索树的中序遍历是递增序列。可以利用…

【AI工具】文字/图片生产3D模型-MVEdit 3D Toolbox

MVEdit 是一款无需培训的 3D 适配器,可 使用现成的 2D 稳定扩散模型进行 3D 生成/编辑 定位:一款功能强大的 3D 工具箱,可通过文本和图像创建和生成 3D 模型,具有可视化 UI 操作。 功能介绍: 能够从多视角图像生成高质量纹理网格,通过 3D 适配器实现出色的 3D 一致性。…

JAVA每日面经——并发编程(一)必看

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、并发编程之AQS二、并发编程之CAS…