Java数据类型系列之八大基本数据类型
ccwgpt 2024-12-05 12:05 52 浏览 0 评论
八大基本数据类型
自从Java发布以来,基本数据类型就是Java语言的一部分,分别是byte, short, int, long, char, float, double, boolean.当然围绕着这些基本数据类型衍生出来了很多面试题,但是说实话,工作中基本用不到
例如:
boolean 占几个字节,char 是否可以表示汉字 等等
其中八大类型又可以分为四种,也就是下面的划分:
? 整型:byte, short, int, long
? 字符型:char
? 浮点型:float, double
? 布尔型:boolean
? 在详细介绍之前,先科普一下,Java中最小的计算单元为字节,1字节=8位(bit)。下面我们列出了每个基本类型对应的默认值
数据类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | '\u0000' |
String (or any object) | null |
boolean | false |
这里还要科普一点,java 编程语言是一门静态类型的编程语言,也就是说你必须先申明变量然后才能使用它,所以你必须不要先申明变量的类型,就像下面一样
int test = 1;
复制代码
这样就告诉了你的程序,test 变量已经存在,并且是int 类型,拥有初始值是1,java 中的变量类型大致分为两类,一类是基本类型,也就是我们今天学的这种,另外一类是引用类型。
为什么需要基本类型
其实在学习这一节之前你需要有点基本知识,那就是包装类型,你可以看我写的这一篇文章Java数据类型—包装类,你只需要知道java 为八大基本了下都提供了包装类,而且在文章中提到了Java 是面向对象的编程语言,那么Java 为什么有提供了基本数据类型,这种不属于对象类型的数据类型呢?
这是因为在Java 中对象的创建一件代价比较大的事情,再加上基本数据类型又是使用的非常广泛的,和String一样,我们知道Java 对String 做了很多优化,这里Java 为了提高程序的效率,提供了基本数据类型,后面你也会学到Java 也为基本数据了下提供了缓存。
需要注意的是包装类型都是不可变的
一. 整型
Java中整型数据属于有符号数,即第一个bit位为0表示正整数,第一个bit位为1表示负整数。在计算机中负数由补码表示,那么补码如何计算呢?
补码=源码取反 + 1;
如:
22,在计算机中的表示为00010110,
-22,取反:11101001,加1:11101010
byte
byte属于Java中的整型,长度为1字节8bit,取值10000000(-128)到 01111111(127),变量初始化默认值为0,包装类Byte
short
short属于Java中的整型,长度为2字节16bit,取值10000000 00000000(-32768)到 01111111 11111111(32767),变量初始化默认值为0,包装类Short
int
int属于Java中的整型,长度为4字节32bit,取值-2^31 (-2,147,483,648)到 2^31-1(2,147,483,647),变量初始化默认值为0,包装类Integer
long
long属于Java中的整型,长度为8字节64bit,取值-2^63 (-9,223,372,036,854,775,808?)到 2^63-1(9,223,372,036,854,775,8087),变量初始化默认值为0或0L,包装类Long
二. 浮点型
Java中浮点型数据无法由二进制直接表示,而是一种对于实数的近似数据表示法,它遵循[IEEE 754](baike.baidu.com/item/IEEE 754/3869922)标准
float
float属于Java中的浮点型,也叫单精度浮点型,长度为4字节32bit,变量初始化默认值0.0f,包装类Float
1. float结构
包含三部分:符号位、指数位、尾数位
2. float取值
注意:根据指数位和尾数位的取值不同,还有很多特殊情况,如NAN,正无穷,负无穷,但平时基本不会用到,这里不再深入;同时由于是近似值,因此无法表示金额,表示金额建议使用BigDecimal
double
double属于Java中的浮点型,也叫双精度浮点型,长度为8字节64bit,变量初始化默认值0.0d,包装类Double
1. double结构
包含三部分:符号位、指数位、尾数位
2. double取值
正规形式:
非正规形式:
根据上面公式很容易计算出double的取值范围为:
(最小值,当符号位S取1,指数位E取2047)
(最大值,当符号位S取0,指数位E取2047)
能取到其间的近似数据。
注意:根据指数位和尾数位的取值不同,还有很多特殊情况,如NAN,正无穷,负无穷,但平时基本不会用到,这里不再深入;同时由于是近似值,因此无法表示金额,表示金额建议使用BigDecimal
三. 字符型
char
char属于java中的字符型,占2字节16bit,可以赋值单字符以及整型数值, 变量初始化无默认值,包装类Character。
如:
char a = 'a';
char a = '中';
char a = 12; // 取值范围0~65536,因为char类型在ASCII字符编码中,有对应的数值,可直接做运算,输出字符表中对应的字符
@Test
public void testChar() {
//任意单个字符,加单引号。
char a1 = 'a';
//任意单个中文字,加单引号。
char a2 = '你';
//整数。0~65535。十进制、八进制、十六进制均可。输出字符编码表中对应的字符。
char a3 = 114;
System.out.println(a3);
}
还有一点就是char 类型支持数学运算,背后的原理就是char 可以转化成对应的数字,然后数字计算之后,又可以对应到字符表中的字符,所以运算结果就是新的字符,下面给了一个截图,给大家看一下char 类型的运算结果是什么
可以看出运算的结果是int 类型,只不过这个int 类型要想赋值给char ,还有一个范围的要求0~65536
还有一点就是,我们经常习惯在做字符串拼接的时候使用+ 所以当你想拼接两个字符的时候,不能直接使用+ 拼接,因为那是加法运算对于char 类型,所以你基本上可以把char 类型看成数值类型
@Test
public void testCharOperation() {
char a1 = 'a' + 'b';
System.out.println(a1);
String a2 = "a" + "b";
System.out.println(a2);
}
// 输出结果
?
ab
所以当我们得到可以基本上将char 看做数值类型的时候,我们就可以尝试将char 类型和数值类型进行计算,快去试试吧,还是我先试试
@Test
public void testCharOperation() {
char a1 = 'a' + 1;
System.out.println(a1);
}
//输出结果
b
四. 布尔型
boolean 仅有两个值true, false,变量初始化默认值false
boolean 到底占几个字节
为什么要问这个问题,首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就boolean类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,boolean类型在编译后会使用其他数据类型来表示,那boolean类型究竟占用多少个字节?当然这个时候你就会听到很多种答案
首先我们看一下如何查看其它基本数据类型锁占用的字节大小,因为你经常看到一张图或者表格关于基本类型所占字节的大小,但是你又记不住,哈哈,只要你知道有下面这个方法,下次就有可以不用百度了,自己动手就可以了
System.out.println(Byte.SIZE);// 8
System.out.println(Short.SIZE);// 16
System.out.println(Integer.SIZE); //32
System.out.println(Long.SIZE); //64
System.out.println(Character.SIZE); //16
System.out.println(Float.SIZE); //64
System.out.println(Double.SIZE); //64
//System.out.println(Boolean.SIZE); //32
输出结果,但是需要注意的实boolean 的包装类Boolean却没有提供这样的属性
8
16
32
64
16
32
64
1 bit
理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。
1 byte
理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。
4 byte
理由来源是《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。
那虚拟机为什么要用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点
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 enables creation of boolean arrays. Arrays of type boolean are accessed and modified using the byte array instruction baload and bastore .
In Oracle 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 在为了高性能上做的付出。
作者:刘不二
链接:https://juejin.cn/post/6918336571011923976
- 上一篇:SQL的数据类型
- 下一篇:Oracle技巧之将数字转换为时分秒,函数
相关推荐
- NestJS入门教程系列一
-
介绍Nest(NestJS)是用于构建高效,可扩展的Node.js服务器端应用程序的框架。它使用渐进式JavaScript,内置并完全支持TypeScript(但开发人员仍然能够使用JavaScrip...
- 【推荐】一个网盘资源搜索与转存工具,支持移动端与PC端!
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍CloudSaver是一个基于Vue3和Express的网盘资源搜索与转存开源实用工具。它支持...
- Appium原理精讲
-
目前使用Appium新版本和旧版本的企业数目都很多,而两个版本的安装过程和api的使用又有较大的区别。但是无论表面上的东东如何变化,内部原理都是一样的。在这里我给大家介绍一下appium的核心,增进大...
- Kubernetes最小部署单元Pod
-
一、Kubernetes与Pod简介在当今云计算和容器化技术盛行的时代,Kubernetes已然成为容器编排领域的中流砥柱。它是一个开源的容器编排平台,由Google基于其内部使用的Bo...
- 最常用的四种跨域解决方案
-
前置知识什么是跨域?浏览器发送的请求地址(URL)与所在页面的地址不同(端口/协议/域名其一不同)。简言之,浏览器发出的请求url,与其所在页面的url不一样。此时,同源策略会让浏览器拒收服务器...
- Bolt.New —— 全栈AI Web自动编程
-
Bolt.New是由StackBlitz公司推出的,全栈AI工具,代码编辑、运行、部署,通通一站式搞定。它使用WebContainers技术,无需任何本地安装或配置,在浏览器中,就可以运行完整的No...
- Nodejs Express新手教程&高手进阶
-
NodejsExpress新手教程&高手进阶Express是一个NodeJS平台的框架,主要用于构于Web服务器项目。本文将通过示例介绍适合新手入门的Express基础使用,以及高手进阶知识,如:c...
- Express.js 创建Node.js Web应用
-
Express.js是一个基于Node.js的Web应用框架,框架的设计目的是构建应用的架构和简化应用的开发。框架会解决一些通用的问题,在Express.js中,Express框架会处理如:中间件、代...
- JavaScript 的 Express.js 功能及应用场景详解
-
Express.js是一个基于Node.js的轻量级Web应用框架,主要用于快速构建服务器端应用和API。它的核心功能包括以下关键点:1.路由管理URL路径与HTTP方法映射:通过...
- nodejs的express4文件下载
-
在nodejs的express框架中,下载变得非常简单,就一个方法,res.download()首先express命令行生成项目基本框架:不会的看这里:http://blog.csdn.net/zz...
- Express 系列:快速生成一个项目
-
系列预告本系列将以一个项目入手结合相关技术细节来带领大家一起学习Express这个基于Node.js的后端框架。本文首先将介绍:如何快速的生成一个具有一定结构的Express项目。Express项目结...
- nodejs的express自动生成项目框架
-
nodejs版本为:4.X,express版本为4.X1.全局安装2个模块express、express-generator在命令行输入:npminstall-gexpressnpminsta...
- express开发(一)简介与搭建
-
上周末去了趟上海书城,不愧是上海数得上号的书城,流行的科技书应有尽有,话不多说直接上图。最经典的C语言O(∩_∩)O最流行的java(づ ̄3 ̄)づ超酷的R语言/(ㄒoㄒ)/~~然而,身为一个坚定的前...
- Vue+Echarts可视化大屏系统后端框架搭建(附代码)
-
各位同学,大家好。上节课,前面我们讲解了Vue+Echarts前端部分的设计方法。这节课程,我们开始讲解使用Express进行后端设计的方法。01项目相关理论介绍什么是expressExpress是...
- Shopify电商API接口开发
-
Shopify电商API接口开发上线流程主要包括以下步骤。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎洽谈合作。前期准备-注册Shopify账号:在Shopify官网注册,用于后续开发测试...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- scrapy框架 (52)
- beego框架 (42)
- java框架spring (43)
- grpc框架 (55)
- 前端框架bootstrap (42)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)