Java的八种基本数据类型

Java的八种基本数据类型

基本数据类型

Java语言提供了八种基本类型。

基本数据类型:数值型、字符型、布尔型。

数值型:整数型byte、short、int、long

浮点型:float、double




byte:

byte数据类型是8位、有符号的,以二进制补码表示的整数;(256个数字),占1字节

最小值是-128(-2^7);

最大值是127(2^7-1);

默认值是0;

byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;

short:

short数据类型是16位、有符号的以二进制补码表示的整数,占2字节

最小值是-32768(-2^15);

最大值是32767(2^15 - 1);

Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;

默认值是0;

int:

int数据类型是32位、有符号的以二进制补码表示的整数;占4字节

最小值是-2,147,483,648(-2^31);

最大值是2,147,485,647(2^31 - 1);

一般地整型变量默认为int类型;

默认值是0;

long:

long数据类型是64位、有符号的以二进制补码表示的整数;占8字节

最小值是-9,223,372,036,854,775,808(-2^63);

最大值是9,223,372,036,854,775,807(2^63 -1);

这种类型主要使用在需要比较大整数的系统上;

默认值是0L;

这里需要注意的是在定义long时,数值大于int的规定最大值会受检报错,需要在数字的尾部加上l。


空间占用

在实际操作中,空间大小又分为两类:

1、理论规定大小。

2、JVM的真实大小。


开辟内存空间发生在变量定义时,且与储存的内容无关,只与数据类型有关。不同的数据类型存同样的数据,所占用的内存是不同的。

这是理论上的图示:


但是在JVM在字节码层面上支持的整数类型确实只有int和long,所有比int小的整数类型都会被提升为int来运算。

(但是在JVM的数组byte[],和short[]中,每个元素是真正的1字节和2字节,我们继续往下看)

所以在Java中byte,short并不会起到提高效率的作用,两者和int的效率基本是一样的。(但数组byte[]、short[]会起到提高效率的作用)。

java虚拟机对byte、char和short的处理方式(转载)

        java字节码中的大部分指令都没有支持整数类型byte、char和short,甚至没有任何指令支持boolean类型,编译器会在编译期或者运行期将byte和short类型的数据带符号扩展为相应的int类型的数据,将boolean和char类型数据零位扩展为相应的int类型数据,与之类型,在处理boolean、byte、short和char类型的数组时,也会转换为使用对应的int类型的字节码指令来处理,因此,大多数对于boolean、byte、short和char类型数据的操作,实际上都是使用相应的int类型作为运算类型

多余定义变量会浪费空间

而只有数组byte[]才会是真正是1字节,short[]是2字节。

此外,定义变量而不使用,是一种浪费空间的行为,Java的编译器会建议你删掉没有使用的变量

目前,我们计算机的内存越来越多。对于常规的定义大多使用int方法,从便利上已满足需要。

但在一些大型程序如游戏的开发中,为了追求极致而节省空间。就会采用相近合适的数据类型来存储数据。

下面,我们来看一看不同数据类型的变量在创建时的内存使用情况。

运行时观看内存情况

注意:byte类型虽然在语义(逻辑)上是占用1字节,但实际上,JVM中是将其当做int看的,也就是事实上是占用了32位,4字节的,所以其运算效率和int没区别。

之所以要有byte/short类型,一是因为某些地方要明确使用这些范围类型,

二是,在byte[]数组中,JVM存储的则是真的1字节,short[]2字节。(但也有的JVM其byte[]数组也是4字节1位)

这种规定与真实的差异是由JVM翻译所造成的。

下面,我们使用Java库的方法来查看内存的使用。

为了使变化更明显,我们定义了一个较大的二维数组来观看:

用int来定义二维数组:


使用内存5833KB


由byte数据类型来创建二维数组:

使用内存2582KB

由于,程序在启动时,还有其他的加载项。所以byte与int并没有呈现严格的4倍关系。

以上,就是不同数据类型的数组开辟内存空间所带来的差异。(考虑到JVM,以上情况仅适用于数组)

以及存储数据并不会带来空间上的变化。


整型间的数字类型转换:

Java中数据类型转换分为自动类型转换和强制类型转换

什么叫做自动转换?

自动转换

小水杯向大水杯倒,不需要进行额外进行操作

强制类型转换

从大类型向小类型,可能会溢出出现错误。

代码中会提示错误,所以要加上强制类型转换

byte b = 127; int i = b;//自动转换

b = (byte)i;//强制转换有可能导致精度丢失。

强制类型转换精度丢失如图所示:


我们知道byte的范围是 -128~127

a=128超出了byte正数的范围,所以b以-128为起始重新开始相加

利用这个特点,在一定情况下可以利用byte反推出int的值(虽然应该用不到)

也可以从二进制数来区分数据类型的大小:


这里boolean类型虽然只有一个二进制数,但仍然和byte一样,占一个字节。(JVM会将boolean翻译成int类型,会占用4个字节。byte和short上面已经提到,char稍后讨论)

浮点型

float

float属于Java中的浮点型,也叫单精度浮点型,长度为4字节32bit,变量初始化默认值0.0f,包装类Float

double

double属于Java中的浮点型,也叫双精度浮点型,长度为8字节64bit,变量初始化默认值0.0d,包装类Double

当整型转向浮点型时要进行强制类型转换

int a = 10;

float b = 10.1f;

a = (int) b;

目前double的使用比较频繁。

字符型

char类型是一个单一的16位Unicode字符;用 ‘’表示一个字符。java 内部使用Unicode字符集,它有一些转义字符  ,2字节

最小值是’\u0000’(即为0);

最大值是’\uffff’(即为65,535);可以当整数来用,它的每一个字符都对应一个数字

字符型相加会按顺序执行,强制转换成int类型会输出对应的ascii码



同样,汉字也可以通过字符相加进行变动。以部首和笔画为顺序



需要注意的是,char类型在虚拟机中也是转换为int类型。

boolean类型

boolean数据类型表示一位的信息;

只有两个取值:true和false;

这种类型只作为一种标志来记录true/false情况;

默认值是false;

boolean的大小(转载)

1、1个bit

理由是boolean类型的值只有true和false两种逻辑值,在编译后会使用1和0来表示,这两个数在内存中只需要1位(bit)即可存储,位是计算机最小的存储单位。

2、1个字节

理由是虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节的最低位存储,其他7位用0填补,如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。

3、4个字节

理由来源是《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硬件层面),具有高效存取的特点。

可以看出,boolean类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。这其实是运算效率和存储空间之间的博弈,两者都非常的重要。


以double为例由控制台输出数据类型大小


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342