《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(整型、浮点型、布尔型)
3.6基本数据类型及字符集编码
前面我们说过,在Java中,每一个变量都必须归属一种类型。Java一共有8种基本数据类型(primitive type)。其中包括4种整型,2种浮点型,1种字符型和1种布尔型。
3.6.1整型
整型就是用来表示没有小数的数值。可以是负数。Java提供了4种整型,废话不多说,直接上表:
类型 |
存储长度 |
取值范围 |
默认值 |
---|---|---|---|
byte |
1字节 |
-128~127(-27~27-1) |
0 |
short |
2字节 |
-32 768~32 767(-215~215-1) |
0 |
int |
4字节 |
-2 147 483 648~2 147 483 647(-231~231-1) |
0 |
long |
8字节 |
-9 223 372 036 854 775 808~9 223 372 036 854 775 807(-263~263-1) |
0L |
在Java中,整型的范围与机器无关,不像C和C++那样,需要针对不同的平台机器选择有效的整型。因此Java可以做到跨平台移植。
实际运用中,用的最多的应该是int型。当然我们在实际应用中,应该需要考虑到一个变量的可能的取值范围,尽可能的选择与之匹配的整型,这样可以节省内存空间。
对于long型的数值,我们会带上一个后缀L,例如:
long number=400000L;
这个后缀用小写l也是可以的,但是由于小写l容易和数值1混淆,因此建议都写成大写的L。
对于列表的默认值,这个的含义是在一个类中定义一个成员变量的时候,可以不初始化,当初始化类的时候,会自动给成员变量赋值为默认值。
这个表,除了第三列的long型外,其余部分需要牢记于心。
3.6.2浮点型
浮点型就是用来表示有小数的数值。可以是负数。Java中提供了2种浮点型:
类型 |
存储长度 |
取值范围 |
默认值 |
---|---|---|---|
float |
4字节 |
大约±3.402 823 47E+38F(有效位数为6~7位) |
0.0F |
double |
8字节 |
大约±1.797 693 134 862 315 70E+308(有效位数为15位) |
0.0D |
float叫做单精度,double叫做双精度。float类型的数值我们会带上后缀F,double类型的数值我们会带上后缀D。
一般情况下,我们都选择使用double类型。浮点数值的计算遵循IEEE754规范,当溢出和出错的时候,会有三种特殊的浮点数值:
- 正无穷大
- 负无穷大
- NaN(不是一个数字)
例如,8除以0的结果为正无穷大。0/0的结果是NaN。
浮点类型不适合用来参与对精度要求高的计算中,例如金融方面的计算。我们如果打印下面语句:
System.out.println(2.0 - 1.1);
结果会很意外的是0.8999999999999999,具体原因需要牵涉到浮点数在计算中的表示方法,一两句话说不清楚,只需要牢记就行。在对精度要求高的计算中,我们会采用BigDecimal类来处理,这个后面会介绍。
3.6.3布尔型
布尔类型就是boolean类型,取值只有2个值:true和false。用来判断逻辑的条件。默认值是false。本来想说明布尔类型的存储长度,结果查阅了很多资料,都没有找到相关说明,很奇怪。先查询了一下官方Java指南:
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
对boolean的定义:
boolean: The
boolean
data type has only two possible values:true
andfalse
. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.
翻译就是说布尔类型表示一位信息,大小不是精确定义的。然后又查了一下官方Java虚拟机文档:
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.3.4
摘抄如下:
Although the Java Virtual Machine defines a boolean type, it only provides very limited support for it. There are no Java Virtual Machine instructions solely dedicated to operations on boolean values. Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java Virtual Machine int data type. The Java Virtual Machine does directly support boolean arrays. Its newarray instruction (§newarray) enables creation of boolean arrays. Arrays of type boolean are accessed and modified using the byte array instructions baload and bastore (§baload, §bastore). In Oracle’s Java Virtual Machine implementation, boolean arrays in the Java programming language are encoded as Java Virtual Machine byte arrays, using 8 bits per boolean element. The Java Virtual Machine encodes boolean array components using 1 to represent true and 0 to represent false. Where Java programming language boolean values are mapped by compilers to values of Java Virtual Machine type int, the compilers must use the same encoding.
翻译大致为:
虽然Java虚拟机定义了布尔型,但它只提供了非常有限的支持。没有专门针对布尔值的操作的Java虚拟机指令。相反,Java编程语言中操作布尔值的表达式被编译为使用Java虚拟机int数据类型的值。 Java虚拟机直接支持布尔数组。它的newarray指令(§newarray)允许创建布尔数组。使用字节数组指令baload和bastore(§baload,§bastore)访问和修改布尔类型的数组。 在Oracle的Java虚拟机实现中,Java编程语言中的布尔数组被编码为Java虚拟机字节数组,每个布尔元素使用8位。 Java虚拟机使用1表示真,0表示假来编码布尔数组组件。如果编译器将Java编程语言布尔值映射为Java虚拟机类型int的值,则编译器必须使用相同的编码。
由以上2段信息,可以得出2个结论:
- boolean类型被编译为int类型,等于是说JVM里占用字节和int完全一样,int是4个字节,于是boolean也是4字节
- 在Oracle的JVM中,boolean数组被编码为byte数组,每个boolean元素占用1个字节
- Java综合题目
- Ubuntu 16.04下为TITAN 1080 显卡安装驱动及Gpu版TensorFlow|深度学习
- 给新生成的节点(动态生成节点)绑定事件方法总结
- JavaWeb(四)JDBC操作Oracle
- JavaWeb(六)Listener监听器
- JSP引入 - UEditor 富文本编辑器
- JavaWeb(五)Filter过滤器
- JavaWeb(七)Cookie,EL表达式,标准标签库
- JavaWeb(八)JQuery
- 程序员如何提一个好问题
- JavaWeb(九)AJAX
- 国内外免费地图SDK都在这了,开发APP再也不怕找不到路了
- Hibernate框架HQL语句
- Hibternate框架笔记
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SpringBoot 2.3.0 新特性一览,快来跟我实践一波!
- 【腾讯】在前端开发中,如何获取浏览器的唯一标识
- 如何实现表格单双行条纹样式
- Angular 容易忽略的知识点
- 语雀自动同步到hexo博客
- 推荐 3 款超好用的 Docker 图形化管理工具
- python标准库之glob介绍
- Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?
- 使用List中的remove方法遇到的坑,不信你没有踩过!
- python opencv 图像尺寸变换
- OpenCv保存图像
- 机器学习|KNN
- docker 查看容器日志
- consul配置ACL
- CentOS7.5更改python版本后及yum不能用的解决办法,非编译!