解读Java数据及数据类型内幕
1、文章导读【学习编程语言最早接触的就是数据和数据类型,对初学者来说,数据和数据类型都是比较抽象的概念,不容易理解,一般采用的方式就是先知道怎么用,以后再理解。本篇用深入浅出地方式讲解Java数据及数据类型,读完文章后你将对数据及数据类型有更深入地理解】下图是由国家统计局公布的2013—2017年国内生产总值及其增长速速的统计图,从图中你可以得到什么结论?

3、上图中的消费总额168,342.60元、97.28%、支持趋势统计图、消费分类TOP榜单、文字描述都属于数据。在上图中,消费分类TOP榜单由数码、居家、购物等分类数据构成,这种由多个数据组成的数据集合可以称为复合数据。从上面的统计图和账单图可以得出一个结论,能够反映和描述客观事物的文本、图形、数值、日期等都属于数据的范畴。本文分成三个小节。第一小节让我们从问题中认识数据;第二小讲述数据的存储结构;第三小节讲述数据类型。第一小节 从问题中认识数据从提出一个实际问题到计算机解出答案需要经过下列步骤:首先从实际问题抽象出数学模型,然后设计一个解此数学模型的算法,编写程序,最后输入数据验证算法,这里输入的数据都是整数或实数,也可以称为数值数据。然而,更多的问题无法用数学模型加以描述,下面我们来看两个例子。例1:假设要做一个网上查书的程序,需要在网页上提供查询和展现书的书名、作者、价格、出版社、分类等内容的功能。要把图书内容存入计算机,如何存放?既要考虑查询时间短,又要考虑节省空间。一个最简单的办法是建立一张表,每一本书的信息,在表中占一行,如图3所示。此时计算机操作的对象(数据元素)便是一张表,计算机对数据的操作是按照某个特定要求(如给定书名)进行查询,找到表中满足要求的一行信息。由此,从网上买书的问题抽象出来的数学模型便是包含图书目录的表和对表进行的查找运算。

5、从上面的两个例子可以看出,描述这样一类问题的数学模型不再是数值方程,而是诸如表、树等非数值性的数据及其运算。下面对数据赋以确定的含义。数据(data)是描述客观事物的数、字符、以及所有能输入到计算机中并被计算机程序处理的符号的集合。它是计算机程序加工的“原料”。例如,一个利用数值分析的方法解代数方程的程序处理的对象只是整数和实数,而一个编译程序或文字处理程序的处理对象是文本。因此,对计算机而言,数据的含义极为广泛,如图形、声音等都属于数据的范畴。数据元素(data element)是数据的基本单位,即数据这个集合中的一个个体。有时一个数据元素可以若干数据项(data item)组成,数据项是数据的最小单位。例如,图3中的每一行(即一本书的信息)为一个数据元素,而其中的每一项为(如书名、作者等)为数据项。数据对象(data object)是具有相同特性的数据元素的集合,是数据的一个子集。例如,英文字母数据对象是集合C={A,B,…,Z}总的来说,数据对象是由数据元素集合组成的,数据元素是由一个或多个数据项组成的。数据的基本单位是数据元素,那么,数据元素在计算机中是如何存储的呢?不同数据元素采用的存储结构相同吗?第二小节 数据的存储结构在算法的数据存储单元——变量一节了解到在计算机上存储信息的最小单位是字节。我们可以用一个由若干字节组合起来形成的一字节串来表示一个数据元素,称这个字节串为元素或结点。当数据元素由若干数据项组成时,则字节串对应于每个数据项的子串称作数据域。例如,在数学运算包含大量的计算表达式,计算程序需要有连续处理计算表达式和计算数据的处理能力,下面是一个简单的四则运算表达式:15.8+20计算程序要处理上述表达式,就需要具备存储小数、整数、运算符的存储结构。Java语言提供了存储小数、整数、运算符的基本数据类型。下图是表达式数据类型到Java数据类型的映射图。

7、从上图可以看出,不同数据的变量在存储器占用的空间也不相同。数据为字符型的变量在存储器占用2个字节的空间,数据为整型的变量在存储器占用4个字节的空间,数据为浮点型的变量在存储器也占用4个字节的空间。因此,不同的数据占用不同的存储空间。上面介绍的存储结构是顺序存储结构,数据存储在连续的存储区域。另外一种存储结构是链式存储结构,该存储结构不要求逻辑上相邻的数据结点在物理位置上相邻,结点间的逻辑关系由附加的引用字段表示,一个结点的引用字段往往指导下一个结点的存放位置。如图7所示。

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

11、(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的存储空间。如下图所示。从图中可以看出,变量sc存储了Scanner存储空间的地址,利用该地址能够访问到Scanner的存储空间,意味着可以使用Scanner提供的属性和方法。类似采用上图链式存储结构方式存储的数据,其类型称为引用数据类型。因为数据并没有直接存储在变量的存储空间,而是存储到另外一个空间,变量的存储空间仅是存储了另外一个空间的地址。这样处理的好处是进行类的传递时,只需要把类对象的地址传过去就可以了,无需传递类对象本身。■ 文章小结1、数据在我们的生活中随处可见,家庭的收入和支出、填写的银行存款单、电视播放的天气预报、新闻等等都属于数据的范畴。计算机数据将现实世界的数据抽象后,形成了基础数据数值型、字符型、和布尔型,并在基础数据的基础上产生复合数据(表、图、树等数据),以及图片、音视频等数据。2、数据有两种方式的存储结构。一种是顺序存储结构,数据存储在连续的内存区域中。一种是链式存储结构,逻辑上相邻的数据在物理存储上并不相邻,要访问应用链式存储结构存储的数据,需要使用数据地址进行访问。3、数据类型给出了数据所需存储空间大小以及数据所表示的精度、特性及范围。按照存储方式的不同,数据类型又分为基本数据类型和引用数据类型。基本数据类型采用顺序存储结构,引用数据类型采用链式存储结构。在数据传递过程中,基本数据类型是传值,引用数据类型是传地址。引用数据类型多用于Java类对象。■ 思考与练习1、家中一般都有书架,书架上放着很多图书。请以此为例,说出数据对象、数据元素和数据项之间的关系。2、请说出数据的顺序存储结构和链式存储结构的区别。3、请说出float和double数据类型的区别。
