八大基本数据类型
自从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 编程语言是一门静态类型的编程语言,也就是说你必须先申明变量然后才能使用它,所以你必须不要先申明变量的类型,就像下面一样
inttest= 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字符编码中,有对应的数值,可直接做运算,输出字符表中对应的字符
@TestpublicvoidtestChar(){//任意单个字符,加单引号。chara1 =a;//任意单个中文字,加单引号。chara2 =你;//整数。0~65535。十进制、八进制、十六进制均可。输出字符编码表中对应的字符。chara3 =114;
System.out.println(a3);
}
还有一点就是char 类型支持数学运算,背后的原理就是char 可以转化成对应的数字,然后数字计算之后,又可以对应到字符表中的字符,所以运算结果就是新的字符,下面给了一个截图,给大家看一下char 类型的运算结果是什么
可以看出运算的结果是int 类型,只不过这个int 类型要想赋值给char ,还有一个范围的要求0~65536
还有一点就是,我们经常习惯在做字符串拼接的时候使用+ 所以当你想拼接两个字符的时候,不能直接使用+ 拼接,因为那是加法运算对于char 类型,所以你基本上可以把char 类型看成数值类型
@TestpublicvoidtestCharOperation(){chara1 =a+b;
System.out.println(a1);
String a2 ="a"+"b";
System.out.println(a2);
}// 输出结果Ã
ab
所以当我们得到可以基本上将char 看做数值类型的时候,我们就可以尝试将char 类型和数值类型进行计算,快去试试吧,还是我先试试
@TestpublicvoidtestCharOperation(){chara1 =a+1;
System.out.println(a1);
}//输出结果b
四. 布尔型
boolean 仅有两个值true, false,变量初始化默认值false
boolean 到底占几个字节
为什么要问这个问题,首先在Java中定义的八种基本数据类型中,除了其它七种类型都有明确的内存占用字节数外,就boolean类型没有给出具体的占用字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,boolean类型在编译后会使用其他数据类型来表示,那boolean类型究竟占用多少个字节?当然这个时候你就会听到很多种答案
首先我们看一下如何查看其它基本数据类型锁占用的字节大小,因为你经常看到一张图或者表格关于基本类型所占字节的大小,但是你又记不住,哈哈,只要你知道有下面这个方法,下次就有可以不用百度了,自己动手就可以了
System.out.println(Byte.SIZE);// 8System.out.println(Short.SIZE);// 16System.out.println(Integer.SIZE);//32System.out.println(Long.SIZE);//64System.out.println(Character.SIZE);//16System.out.println(Float.SIZE);//64System.out.println(Double.SIZE);//64//System.out.println(Boolean.SIZE); //32
输出结果,但是需要注意的实boolean 的包装类Boolean却没有提供这样的属性
8163264163264
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, expressionsinthejavaprogramminglanguagethat operateonbooleanvaluesarecompiledtousevaluesofthejavavirtualmachineintdatatype.
Thejavavirtualmachine does directly supportbooleanarrays. Its newarray instruction enablescreationofbooleanarrays. Arraysoftypebooleanareaccessedandmodifiedusingthebytearrayinstruction baloadandbastore .InOraclejavavirtualmachine implementation,booleanarraysinthejavaprogramminglanguageareencodedasjavavirtualmachinebytearrays,using8bits perbooleanelement.
Thejavavirtualmachine encodesbooleanarraycomponentsusing1torepresenttrueand0torepresentfalse.Wherejavaprogramminglanguagebooleanvaluesaremappedbycompilerstovaluesofjavavirtualmachinetypeint, the compilers mustusethe sameencoding
其实可以看出这也是Java 在为了高性能上做的付出。
作者:刘不二链接:https://juejin.cn/post/6918336571011923976
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容