Java基本数据类型

来源:互联网 发布:unity3d lua教程 编辑:程序博客网 时间:2024/05/20 14:39

1.Java基本数据类型【草案】

(写了很多Java程序,也开发过很多Java项目,现在才决定要写点Java相关的系列文章,因为我对自己的文章没有绝对的信心,都是开发过程中的经验之谈,再加上我自己以前考过SCJP证书,所以希望写点不误导读者的更加细节和详细的文章出来,所以希望有读者觉得有笔误的话留我的Email地址给我,而且为了不误导读者,都使用了【草案】,谢谢大家的合作:silentbalanceyh@126.com)

【以下讲解都在32bit的系统中】

1.Java数据类型基本概念:

数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。接触每种语言的时候,都会存在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语言,所以Java对于数据类型的规范会相对严格。数据类型是语言的抽象原子概念,可以说是语言中最基本的单元定义,在Java里面,本质上讲将数据类型分为两种:简单类型和复杂类型。

简单类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。

复杂类型:Java语言本身不支持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型一般都是通过类或接口进行构造,类提供了捆绑数据和方法的方式,同时可以针对程序外部进行信息隐藏。

2.Java中的基本类型:

1)概念:

Java中的简单类型从概念上分为四种:实数、整数、字符、布尔值。但是有一点需要说明的是,Java里面只有八种原始类型,其列表如下: 实数:double、float

整数:byte、short、int、long

字符:char

布尔值:boolean

复杂类型和基本类型的内存模型本质上是不一样的,简单数据类型的存储原理是这样的:所有的简单数据类型不存在“引用”的概念,简单数据类型都是直接存储在内存中的内存栈上的,数据本身的值就是存储在栈空间里面,而Java语言里面只有这八种数据类型是这种存储模型;而其他的只要是继承于Object类的复杂数据类型都是按照Java里面存储对象的内存模型来进行数据存储的,使用Java内存堆和内存栈来进行这种类型的数据存储,简单地讲,“引用”是存储在有序的内存栈上的,而对象本身的值存储在内存堆上的。

2)详细介绍:

Java的简单数据讲解列表如下:

int:int为整数类型,在存储的时候,用4个字节存储,范围为

-2,147,483,648到2,147,483,647,在变量初始化的时候,int类型的默认值为0。

short:short也属于整数类型,在存储的时候,用2个字节存储,范围为-32,768到32,767,在变量初始化的时候,short类型的默认值为0,一般情况下,因为Java本身转型的原因,可以直接写为0。

long:long也属于整数类型,在存储的时候,用8个字节存储,范围为-9,223,372,036,854,775,808到9,223,372,036, 854,775,807,在变量初始化的时候,long类型的默认值为0L或0l,也可直接写为0。 byte:byte同样属于整数类型,在存储的时候,用1个字节来存储,范围为-128到127,在变量初始化的时候,byte类型的默认值也为0。

float:float属于实数类型,在存储的时候,用4个字节来存储,范围为32位IEEEE 754单精度范围,在变量初始化的时候,float的默认值为0.0f或0.0F,在初始化的时候可以写0.0。

double:double同样属于实数类型,在存储的时候,用8个字节来存储,范围为64位IEEE 754双精度范围,在变量初始化的时候,double的默认值为0.0。

char:char属于字符类型,在存储的时候用2个字节来存储,因为Java本身的字符集不是用ASCII码来进行存储,是使用的16位Unicode字符集,它的字符范围即是Unicode的字符范围,在变量初始化的时候,char类型的默认值为'u0000'。

boolean:boolean属于布尔类型,在存储的时候不使用字节,仅仅使用1位来存储,范围仅仅为0和1,其字面量为true和false,而boolean变量在初始化的时候变量的默认值为false。

3)相关介绍:

在Java基本类型在使用字面量赋值的时候,有几个简单的特性如下:

【1】当整数类型的数据使用字面量赋值的时候,默认值为int类型,就是直接使用0或者其他数字的时候,值的类型为int类型,所以当使用long a = 0这种赋值方式的时候,JVM内部存在数据转换。

【2】当实数类型的数据使用字面量赋值的时候,默认值为double类型,就是当字面两出现的时候,JVM会使用double类型的数据类型。

(*:以上两点在转型中进行详细说明。)

【3】从JDK 5.0开始,Java里面出现了自动拆箱解箱的操作,基于这点需要做一定的说明:

对应原始的数据类型,每种数据类型都存在一个复杂类型的封装类,分别为Boolean、Short、Float、Double、Byte、Int、Long、Character,这些类型都是内置的封装类,这些封装类(Wrapper)提供了很直观的方法,针对封装类需要说明的是,每种封装类都有一个xxxValue()的方法,通过这种方法可以把它引用的对象里面的值转化成为原始变量的值,不仅仅如此,每个封装类都还存在一个valueOf(String)的方法直接把字符串对象转换为相应的简单类型。 在JDK 5.0之前,没有存在自动拆解箱的操作,即Auto Box操作,所以在这之前是不能使用以下方式的赋值代码的:

Integer a = 0; //这种赋值方式不能够在JDK 1.4以及以下的JDK编译器中通过

但是JDK 5.0出现了自动拆解箱的操作,所以在JDK 5.0以上的编译器中,以上的代码是可以通过的,关于自动拆箱解箱我会另外用一篇1.4到5.0的升级加以详细说明。

3.Java中简基本数据类型的转型:

Java中的简单数据类型的转换分为两种:自动转换和强制转换

1)自动转换:

当一个较“小”的数据和较“大”的数据一起运算的时候,系统将自动将较“小”的数据转换为较“大”的数据,再进行运算。

在方法调用过程,如果实际参数较“小”,而函数的形参比较“大”的时候,除非有匹配的方法,否则会直接使用较“大”的形参函数进行调用。

2)强制转换:

将“大”数据转换为“小”数据时,可以使用强制类型转换,在强制类型转换的时候必须使用下边这种语句:

int a = (int)3.14;

只是在上边这种类型转换的时候,有可能会出现精度损失。

关于类型的自动提升,遵循下边的规则:

所有的byte、short、char类型的值将提升为int类型; 如果有一个操作数是long类型,计算结果是long类型; 如果有一个操作数是float类型,计算结果是float类型; 如果有一个操作数是double类型,计算结果是double类型; 自动类型转换图如下:

byte->short(char)->int->long->float->double

如果是强制转换的时候,就将上边的图反过来

3)转换附加:

当两个类型进行自动转换的时候,需要满足条件:【1】这两种类型是兼容的,【2】目的类型的数值范围应该比源转换值的范围要大。而拓展范围就遵循上边的自动类型转换树,当这两个条件都满足的时候,拓展转换才会发生,而对于几个原始类型转换过程,根据兼容性boolean和char应该是独立的,而其他六种类型是可以兼容的,在强制转换过程,唯独可能特殊的是char和int是可以转换的,不过会使用char的ASCII码值比如:

int a = (int)'a';

a的值在转换过后输出的话,值为97;

4.Java中的高精度数:

Java提供了两个专门的类进行高精度运算:BigInteger与BigDecimal,虽然Java原始变量都具有对应的封装类型,但是这两个变量没有对应的原始类型,而是通过方法来提供这两种类型的一些运算,其含义为普通类型能够做的操作,这两个类型对应都有,只是因为精度过大可能效率不够高。至于这两个类的具体操作可以参考JDK的相关API文档。

5.关于数据类型的一些技巧:(以下为参考一篇原文文档)

若要求精度的结果,尽量避免使用float和double:

float和double类型本身是为了做科学运算,即执行二进制浮点运算而设计,但是却不能提供完全精确的结果,所以在要求精度的数值中,避免使用float

和double,float和double在货币运算中尤其不合适,要让float和double精确表达0.1也是不可能的事。测试一下下边这段代码就明白了:

System.out.println(2.02-0.42);

结果是不是出乎意料,这个结果并不是偶然,而是JVM本身设计的目的决定的。而要解决这个问题,最好的办法是使用BigDecimal、int或者long进行相关运算,特别是货币运算,使用BigDecimal代替double是一个很好的办法。 BigDecimal唯一的缺点在于:BigDecimal没有相对应的原始类型,所以在进行基本数值运算的时候,需要进行方法调用才能操作,这样会使得和我们的编程习惯不相符合,若使用int和long,就需要进行简单的封装运算。

所以在要求精度答案的计算任务里面,一般慎用float和double,如果在进行商务运算,并且要求四舍五入或者简单的舍入行为,使用BigDecimal可能更加方便。所以尽量避免在精度运算中使用float和double,特别是我们常用的货币运算。

5.总结:

以上是开发过程中针对Java数据类型的一份总结,最后一个技巧是在一个商务系统运算的时候发现的,然后参考了网上的很多文档,偶然在一篇BLOG中发现的,原文提倡在精度运算中尽量不用float和double,而关于Java的基本数据类型,上边应该涵盖了所有开发会用到的内容,还有一点就是在于几个特殊值的比较,这里没有做说明,比如Double.NaN == Double.NaN输出为false,等等所有封装类的特殊类型,没有进行详细说明。

Java免费学习资料直播公开课群:175161984
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 压着眼睛睡觉醒来模糊怎么办 天热眼睛有眼屎怎么办 眼睛里膜起来了怎么办 眼睛一边大一边小怎么办 眼白膜鼓起来了怎么办 主持问答环节没人提问怎么办 转学原学校不给怎么办 村长借东西不还怎么办 村长不上报建房申请怎么办 村长不上报建房手续申请怎么办 村长不给村民盖章怎么办? 找村干部办事难怎么办 洪洞县村长不给我盖章怎么办 睾丸穿刺取精只配到6个胚胎怎么办 孩子一只耳朵听不到声音怎么办 孕早期孕囊生长慢怎么办 试管2次不着床怎么办? pescm球员年龄大了怎么办 实况足球俱乐部经理球员老了怎么办 你不是我的菜怎么办 苹果平板电脑耳机有回音怎么办 obs直播有电流音怎么办 语音里网吧很吵怎么办 电脑k歌有延迟怎么办 想开个跆拳道馆怎么办营业执照? 壶嘴拐弯处漏水怎么办 裂纹茶壶嘴坏了怎么办 小孩刚上学怕她上火怎么办 在幼儿园小朋友不愿叠衣服怎么办 孩子在家听话幼儿园不听话怎么办 变魔术时观众说看过这个怎么办 孕妇8个月摔跤了怎么办 孩子吃了残奶怎么办 小米手机变卡了怎么办 主持时说错话了怎么办 小鲜肉老了不红怎么办 同学聚会大家玩手机你怎么办 率土之滨被掠夺怎么办 戒指戴手上取不下来怎么办 择离开我我该怎么办 解小手解不出来怎么办