Java基础总结(二)基本数据类型详解

今天我们来介绍一下Java中的基本数据类型。

首先我们需要知道,Java是一种强类型语言,这就意味着我们必须为每一个变量声明一种数据类型,在Java中,一共有八种基本数据类型和三种引用数据类型,其中基本数据类型又包含4种整形、2种浮点型、一种字符型和一种用于表示真值的boolean类型。下面我们将会着重对基本数据类型进行介绍。

目录

八种基本数据类型

整型

浮点类型

char类型

boolean类型

数据类型转换

强制类型转换


八种基本数据类型

整型

整型用于表示没有小数部分的数值,并且允许为负,Java为我们提供了4种不同的整型来方便我们的使用,具体内容如下

类型存储需求取值范围
byte1字节-128~127
short2字节-2^15 ~ 2^15 - 1
int4字节-2^31 ~ 2^31 - 1
long8字节-2^63 ~ 2^63 - 1

一般来说,int类型最为常用,但是如果要表示整个地球的居住人口或者是时间(从1970年1月1日0时至此时此刻的毫秒数)等大数据的时候,就需要用到long类型,而byte和short类型主要用于特定的一些场合,例如底层处理或者存储空间很宝贵时的大数组,从而更高效率的利用内存空间。不过在运算时不同的数据类型会导致有报错的风险,这个在下文会有详细解释。

细心的你会发现,为什么byte取值范围会是-128~127呢?为什么负数可以比正数多存一个呢?

浮点类型

浮点类型用于表示有小数部分的数值,在Java中有两种浮点类型,具体内容如下:

类型存储需求取值范围
float4字节-3.403 *10^38 ~ 3.403 *10^38
double8字节-1.798 *10^308 ~ 1.798 *10^308

float被称为单精度数值,而double类型的数值精度是float的两倍,所以又被称为双精度数值,在很多情况下,float类型的精度(6~7位有效数字)并不能满足我们计算的需求,所以相对于float来说,double类型更为常用。

需要注意的是,在定义float类型的数据时,需要加上后缀F或f(例如:float a=3.14f)没有加后缀的浮点数值默认为double类型。

有三个特殊的数值会导致浮点数值溢出和报错:

1.正无穷大

2.负无穷大

3.NaN(不是一个数字)

例如:一个正整数除以0等于正无穷大(溢出),而计算0/0则等于NaN(报错)。

char类型

char类型用于表示单个字符。(如今情况有所变化,有些Unicode字符可以用一个char值描述,但另一些则需要两个char值)

char来行的字面量值需要用单引号括起来,例如'A'; 注意,它与"A"不同,后者半酣一个字符A 的字符串。

char值可以参与运算,例如:'a'+1=98;这是根据char值所对应的AscoII码表中的对应值来算的。但字符串并不能参与运算,只能拼接,例如:"你"+"好"="你好"。

boolean类型

boolean(布尔)类型只有两个值:true和flase,用来判定逻辑条件。

注意:整型值和布尔值之间不能进行相互转换。


以上就是Java中的八种基本数据类型了,接下来说一说整型和浮点型计算的时候会产生的一些问题。

数据类型转换

下面看一种情况:

 byte a=1;
 byte b=2;
 byte c=a+b;
 System.out.println(c);

很简单的运算,有人会说,运算出来的结果显而易见,会输出3,但事实并不是这样,我们来看一看:

 java: 不兼容的类型: 从int转换到byte可能会有损失

出乎意料了吧,那这是因为什么呢,其实原因很简单,这是因为Java的常量优化机制,当byte与byte(或者 short char)进行运算的时候,会提升至int类型,也就是说,你计算得到的3其实是int3,而你却给他开辟了一个byte类型的空间,我们已经知道,byte占1个字节,而int占4个字节,你将int类型的数值放进byte类型的存储空间中,就相当于将四个箱子里的东西放进一个箱子里(当然,1字节和4字节存储量的大小并不是简单的一对四,这里只是打个比方,方便大家的理解),这就会导致你不得不丢掉一些东西,这就是所谓的精度损失。所以我们将byte c 换成int c,就没有问题啦。

下面看第二种情况:

 float a=3.14f;
 float b=2.0f;
 long c =a+b;
 System.out.println(c);

这次会是什么结果呢?

有人会说,float占4字节,long占8字节,这次一定没问题了,那么我们来看一看:

 java: 不兼容的类型: 从float转换到long可能会有损失

傻眼了吧,怎么从小转大还是会有精度损失呢?其实如果你仔细观察上面的表格你就会发现,虽然float只占4个字节,但是它的范围其实是要比long还要大的,这是由于他们底层存储和运算方式的不同,所以造成这样的现象。

强制类型转换

那么,在上文的基础上,我们想到,Java常量优化其实是会对存储资源产生浪费的,比如,我用byte明明可以存储的值,可电脑却将它自动转为int类型,白白浪费了这剩下的3个字节的存储空间,如果是一个值还好说,可要是成百上千个值,是不是会产生较大的浪费,那么我们也可以对其进行强制转型,就将它转为byte类型,如下:

 byte c=(byte)(a+b);

我们就将他转为byte类型,这样就解决了内存空间的问题,不过这样做有较大的隐患,有时候会导致巨大的误差。

举个例子,大家看下面这段代码:

 float a=1/2f;
 int b=(int)(100*a);
 System.out.println(b)

我们对100*a的值进行了强制转型,将它转成了int类型,因为100 *(1/2)的值在我们看来等于50,int是完全可以存储的,那么我们看一下结果:

 0
 ​
 进程已结束,退出代码为 0

我们得到了一个0值,这和我们算出来的50差的太多了,这是因为我们将float转成int时,他会自动丢弃小数点后的数,于是1/2的0.5就变成了0,最后的结果就变成了0,所以强制转型有可能会导致精度的损失。

以上就是我总结的一些有关数据类型所要注意的点啦,希望可以对你们有所帮助。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值