当前位置:   article > 正文

Java 类型数据,解读Java数据及数据类型内幕

scnaaer

文章导读

【学习编程语言最早接触的就是数据和数据类型,对初学者来说,数据和数据类型都是比较抽象的概念,不容易理解,一般采用的方式就是先知道怎么用,以后再理解。本篇用深入浅出地方式讲解Java数据及数据类型,读完文章后你将对数据及数据类型有更深入地理解】

下图是由国家统计局公布的2013—2017年国内生产总值及其增长速速的统计图,从图中你可以得到什么结论?

638b1fcf8f04efac7464319db822f794.png图1 2013-2017年国内生产总值及其增长

从图中可以看出,国内生产总值从2013年到2017年逐年递增,但增长速度略有下降,从7.8%下降到6.9%。

得出结论的依据就是图中给出的数据,图中的主要数据有国内生产总值、比上年的增长率,辅助数据有直角坐标轴上的数值、图例文字说明、日期、粉红色的矩形。其中,国内生产总值是整数,比上年的增长率是小数,直角坐标轴上的数值为整数,图例文字说明是文本,矩形是图形。

下图是某支付网站晒出的一个支付用户的账单。从账单中可以看出这个用户总共花了168,342.60元,超过了97.28%的用户,并给出支出趋势统计图和消费分类TOP榜单。

09117d68a9d77dbd48a6d6a8fe7d9261.png图2 晒出的账单

上图中的消费总额168,342.60元、97.28%、支持趋势统计图、消费分类TOP榜单、文字描述都属于数据。在上图中,消费分类TOP榜单由数码、居家、购物等分类数据构成,这种由多个数据组成的数据集合可以称为复合数据。

从上面的统计图和账单图可以得出一个结论,能够反映和描述客观事物的文本、图形、数值、日期等都属于数据的范畴。

本文分成三个小节。第一小节让我们从问题中认识数据;第二小讲述数据的存储结构;第三小节讲述数据类型。

第一小节 从问题中认识数据

从提出一个实际问题到计算机解出答案需要经过下列步骤:首先从实际问题抽象出数学模型,然后设计一个解此数学模型的算法,编写程序,最后输入数据验证算法,这里输入的数据都是整数或实数,也可以称为数值数据。

然而,更多的问题无法用数学模型加以描述,下面我们来看两个例子。

例1:假设要做一个网上查书的程序,需要在网页上提供查询和展现书的书名、作者、价格、出版社、分类等内容的功能。要把图书内容存入计算机,如何存放?既要考虑查询时间短,又要考虑节省空间。一个最简单的办法是建立一张表,每一本书的信息,在表中占一行,如图3所示。此时计算机操作的对象(数据元素)便是一张表,计算机对数据的操作是按照某个特定要求(如给定书名)进行查询,找到表中满足要求的一行信息。由此,从网上买书的问题抽象出来的数学模型便是包含图书目录的表和对表进行的查找运算。

84ac648dc334c97883ec48cc174d0d06.png图3 图书目录

例2:假设要开发一个绘图程序,要求绘图程序根据存储的企业组织结构信息,以层次结构的方式绘制出来。一般来说,企业各级组织关系都是层次关系,该关系类似一棵树,企业的最高层(董事长)为树的根,中层(科室)为树的分叉,科员为树的叶子。如图4所示。由此把绘制企业组织结构的问题变换为树的遍历操作。

96b36b946615ce98a0b22180fc359cdf.png图4 企业组织的层次结构

从上面的两个例子可以看出,描述这样一类问题的数学模型不再是数值方程,而是诸如表、树等非数值性的数据及其运算。下面对数据赋以确定的含义。

数据(data)是描述客观事物的数、字符、以及所有能输入到计算机中并被计算机程序处理的符号的集合。它是计算机程序加工的“原料”。例如,一个利用数值分析的方法解代数方程的程序处理的对象只是整数和实数,而一个编译程序或文字处理程序的处理对象是文本。因此,对计算机而言,数据的含义极为广泛,如图形、声音等都属于数据的范畴。

数据元素(data element)是数据的基本单位,即数据这个集合中的一个个体。有时一个数据元素可以若干数据项(data item)组成,数据项是数据的最小单位。例如,图3中的每一行(即一本书的信息)为一个数据元素,而其中的每一项为(如书名、作者等)为数据项。

数据对象(data object)是具有相同特性的数据元素的集合,是数据的一个子集。例如,英文字母数据对象是集合

C={A,B,…,Z}

总的来说,数据对象是由数据元素集合组成的,数据元素是由一个或多个数据项组成的。

数据的基本单位是数据元素,那么,数据元素在计算机中是如何存储的呢?不同数据元素采用的存储结构相同吗?

第二小节 数据的存储结构

在算法的数据存储单元——变量一节了解到在计算机上存储信息的最小单位是字节。我们可以用一个由若干字节组合起来形成的一字节串来表示一个数据元素,称这个字节串为元素或结点。当数据元素由若干数据项组成时,则字节串对应于每个数据项的子串称作数据域。

例如,在数学运算包含大量的计算表达式,计算程序需要有连续处理计算表达式和计算数据的处理能力,下面是一个简单的四则运算表达式:

15.8+20

计算程序要处理上述表达式,就需要具备存储小数、整数、运算符的存储结构。Java语言提供了存储小数、整数、运算符的基本数据类型。下图是表达式数据类型到Java数据类型的映射图。

4ee0d7177cb19c98a200cee392aaf63f.png图5 表达式数据类型到Java数据类型的映

为说明问题起见,给出一个简化计算表达式:8.25+30

声明三个变量用来存储运算数和运算符

public float floatNum;

public int intNum;

public char op;

计算程序在计算上述计算表达式时,首先从左到右扫描表达式。假设本次扫描不考虑优先级运算,只是完成提取运算数和运算符的功能。扫描过程如下:如果是运算数,判断是整型还是小数,整型赋值给intNum,如果是小数赋值给floatNum,如果是运算符赋值给op。下图是扫描完成后,变量在内存储器的存储情况。

c396a4fd592d25796765d2b569f35c87.png图6 不同数据类型的变量在存储器的存

从上图可以看出,不同数据的变量在存储器占用的空间也不相同。数据为字符型的变量在存储器占用2个字节的空间,数据为整型的变量在存储器占用4个字节的空间,数据为浮点型的变量在存储器也占用4个字节的空间。因此,不同的数据占用不同的存储空间。

上面介绍的存储结构是顺序存储结构,数据存储在连续的存储区域。另外一种存储结构是链式存储结构,该存储结构不要求逻辑上相邻的数据结点在物理位置上相邻,结点间的逻辑关系由附加的引用字段表示,一个结点的引用字段往往指导下一个结点的存放位置。如图7所示。

9335e78c3f00610731d72f9e2259e4a4.png图7 链式存储结构

Java在分配变量存储空间时,需要辨别数据的类别,根据数据的类别分配相应的存储空间。如果是字符数据就分配2个字节的空间,若是整数就分配4个字节的空间,以此类推。那么问题就来了,Java语言是如何辨别数据类别的呢?前面算法的数据存储单元——变量一节中给出了声明变量的语法,语法规则要求在声明的变量名之前要加上数据类型,数据类型决定了数据的存储空间。

第三小节 认识数据类型

数据类型给出了数据所需存储空间大小以及数据所表示的精度、特性及范围。例如,在Java语言中,int类型的数据占用4个字节的存储空间,可表示的最小数值为-2147483648,最大数值为2147483647。再如,byte类型占用1个字节的存储空间,可表示的最小数值为-128,最大数值为127。

按照数据存储结构的不同,Java数据类型分为基本数据类型和引用数据类型两大类。基本数据类型采用顺序结构存储,引用数据类型采用链式存储结构。

基本数据类型

基本数据类型又包括数值类型、字符型和布尔类型。如下图所示。

8c981820ba671d180e866fa8fa0df401.png图8 java基本数据类型

(1)数值型

数值型即数值数据,用于表示数量,并可以进行数值运算。数值型数据由整数和小数组成,分别对应整数类型和浮点类型。数值型数据类型说明如下。

51f5975600b93fbae6f38cc49e870c2c.png图9 数值型

上图中的byte、short、int、long类型比较容易理解。下面重点对浮点类型float和double进行补充说明。

Java的浮点类型有两种不同的表示形式:十进制数和科学计数法。十进制数形式,由数字和小数点组成,且必须有小数点,如0.123、12.85、26.98等;科学计数法形式,如:2.1E5、3.7e-2等。其中e或E之前必须有数字,且e或E后面的指数必须为整数。

科学计数法一种简化计数的方法,对于位数较小的数值,科学计数法没有什么优势,但对于位数较多的数值其计数方法的优势就非常明显了。例如:光的速度是300,000,000米/秒,全世界人口数大约是6,100,000,000。类似光的速度和世界人口数这样大数值的数,读、写都很不方便,仔细观察上面的两个数值,光的速度可以写成3*108米/秒,全世界人口数可以写成6.1*109。这种计数方法就是科学计数法,用Java语言科学计数法表示光速是3E8,世界人口数大约是6.1E9。

浮点类型有float和double两种,分别代表单精度和双精度的数值。精度是指描述一个数值的准确程度,在数学运算中,经常会用到近似数,近似数与原数值非常相近,但又不完全符合原数值,只能说在某种程度上近似。精度与近似数相似,也是用一个与原数值非常相近的数代替原来的数值。

前面说过存储一个数值所用的字节越多,其精度越高,数值范围也越大。由此看来,精度与存储字节数密切相关,float类型的存储空间是4个字节,其表示的值范围约为1.4E-45到3.4028235E38,double类型的存储空间是8个字节,其表示的值范围约为4.9E-324到1.7976931348623157E308,float存储数值的精度和范围要小于double存储数值的精度和范围。因此,float是单精度数值,double是双精度数值。

22654b8bbed6c223b26016d9caedd741.png图10 浮点型变量占用的存储空间

(2)字符型

计算机除了处理数值数据,还要处理字符数据。Java语言提供了一种char数据类型,用于字符数据。char类型占2个字节的存储空间,该类型可以存储英文字符,也可以存储单个汉字。

char型变量只能存储单个英文和中文字符,即可以把字符直接赋值给char型变量,也可以直接把字符所在字符集的编码赋值给char型变量,Java输出char型变量时,输出到显示设备(如电脑屏幕)的是字符本身。

(3)布尔型

布尔类型是表示逻辑状态的类型,在详解Java表达式与运算符一文中谈到关系运算符和逻辑运算符运算返回的结果是布尔值,这个布尔值就是布尔型。java语言通过关键字boolean来定义布尔型变量,只有true和false两个值,分别代表布尔逻辑中的“真”和“假”。Java语言虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替。

boolean变量编译后被转换为int变量,占用4个字节的存储空间,true被转换为1赋值给int变量,false被转换为0赋值给int变量。因此,程序需要判断数值的真或假时,既可以用boolean类型变量,也可以用int类型的变量,当然也可以用byte类型的变量。

引用数据类型

前面例1中的图书目录是一个表结构,包含多个数据项,类似图书目录这样的表结构,显然不适合用前面的基本数据类型表示。后面会讲到Java类,Java类可以存储这样的表结构。

关于Java类,在使用Eclipse集成开发工具编写程序一文中已经使用过,如System类和Scanner类,System类可以直接使用,Scanner类则需要声明并用new运算符初始化后才能使用。Scnaaer类的声明及初始化代码如下:

Scanner sc;

sc = new Scanner(System.in);

代码首先声明了Scanner类的变量sc,此时,Java虚拟机为变量sc分配了一个4字节的存储空间。当调用new运算符初始化Scanner类时,Java虚拟机为Scanner类分配存储空间,并把该存储空间的地址赋值给sc的存储空间。如下图所示。

7b7f87e6f08fc26593a66eb471743763.png图11 sc指向Scanner的存储空间

从图中可以看出,变量sc存储了Scanner存储空间的地址,利用该地址能够访问到Scanner的存储空间,意味着可以使用Scanner提供的属性和方法。

类似采用上图链式存储结构方式存储的数据,其类型称为引用数据类型。因为数据并没有直接存储在变量的存储空间,而是存储到另外一个空间,变量的存储空间仅是存储了另外一个空间的地址。这样处理的好处是进行类的传递时,只需要把类对象的地址传过去就可以了,无需传递类对象本身。

■ 文章小结

1、数据在我们的生活中随处可见,家庭的收入和支出、填写的银行存款单、电视播放的天气预报、新闻等等都属于数据的范畴。计算机数据将现实世界的数据抽象后,形成了基础数据数值型、字符型、和布尔型,并在基础数据的基础上产生复合数据(表、图、树等数据),以及图片、音视频等数据。

2、数据有两种方式的存储结构。一种是顺序存储结构,数据存储在连续的内存区域中。一种是链式存储结构,逻辑上相邻的数据在物理存储上并不相邻,要访问应用链式存储结构存储的数据,需要使用数据地址进行访问。

3、数据类型给出了数据所需存储空间大小以及数据所表示的精度、特性及范围。按照存储方式的不同,数据类型又分为基本数据类型和引用数据类型。基本数据类型采用顺序存储结构,引用数据类型采用链式存储结构。在数据传递过程中,基本数据类型是传值,引用数据类型是传地址。引用数据类型多用于Java类对象。

■ 思考与练习

1、家中一般都有书架,书架上放着很多图书。请以此为例,说出数据对象、数据元素和数据项之间的关系。

2、请说出数据的顺序存储结构和链式存储结构的区别。

3、请说出float和double数据类型的区别。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/675931
推荐阅读
相关标签
  

闽ICP备14008679号