版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6章 引用数据类型,除了简单数据类型外,Java语言还定义了许多复合数据类型,如数组、字符串、集合等。这些复合数据类型都是以类的形式进行定义的,包含许多属性和方法。综合使用简单数据类型和复合数据类型,可以处理实际需求中遇到的各种数据形式,能够编写更加复杂的程序。,6.1 相同类型的数据数组,数组是Java语言中的一种复合数据类型,是具有相同数据类型的数据集合。数组中的每个数据称为数组元素,数组元素是有序的。关于数组的知识主要包括数组的定义、创建数组、数组的使用及多维数组,下面分别进行介绍。,6.1.1 定义数组,要使用数组,首先需要定义数组。定义数组的语法格式有两种,如图6.1所示。 注意:
2、定义数组时不能指定数组的长度。比如int10array1;,这条语句是错误的。,6.1.2 创建数组,要想数组能被真正使用,只定义数组是不够的,还需要为其分配内存空间和初始化。下面分别进行介绍。,1创建数组,为数组分配了内存空间,才是在物理形式上真正创建了数组。在Java语言中,所有分配内存的动作都是由关键字new来完成的。关于new的概念后续章节会详细说明。由于数组属于复合类型,所以也由new关键字完成创建。创建数组的语法格式如图6.2所示。,1创建数组,另外,可以将定义数组与创建数组合并成一条语句,定义数组时即完成创建。数组定义时即完成创建的语法格式如图6.3所示。,2数组初始化,如果用n
3、ew关键字创建了数组,则系统会使用数据类型的默认值为数组每一个元素默认初始化。另外,可以在定义数组的时候完成初始化。定义并初始化数组的语法格式如图6.4所示。 注意:数组长度指定后不能再改变。,6.1.3 使用数组,数组创建完成后即可使用。数组的使用最普遍的就是访问数组的元素。访问数组元素的语法格式如图6.5所示。 数组下标从0开始,到数组长度减1结束。另外,可以通过数组的length属性访问数组的长度。关于属性的概念后续章节会详细说明。,6.1.4 数组的数组多维数组,由于数组的数据类型可以是各种Java数据类型,当然也包括数组类型。这种数组类型的数组就构成了多维数组。实际上二维数组是以一维
4、数组为元素构成的数组。如此递归,可以形成更多维数组。下面以二维数组为例进行讲解,多维的情形与二维类似。 二维数组的定义语法格式如图6.6所示。,6.1.4 数组的数组多维数组,二维数组的创建语法格式如图6.7所示。 二维数组的使用语法格式如图6.8所示。,6.2 多个字符字符串,字符串是Java中经常使用的复合数据类型。在本质上,字符串实际上为char型数组。字符串由Java.lang.String类来表示,该类具有一系列的属性和方法,提供对字符串的各种操作。除了String类,Java还提供了StringBuffer类用来处理可变长度的字符串。下面分别进行介绍。,6.2.1 创建字符串,同其
5、他类型数据一样,要想使用字符串数据,首先需要创建字符串。创建字符串的语法格式如图6.9所示。 String作为类,具有不同的构造方法。比较特殊的是,String可以同Java中的基本数据类型一样使用,由系统自动完成创建。作为基本数据类型使用的语法格式如下所示。,6.2.1 创建字符串,注意:字符串变量的值必须位于“”号内。String类型的字符是长度不能改变的。比如,代码String s=“ab”;s=“abc”;其实创建了两个字符串对象,第一个为“ab”,长度为2;第二个为“abc”,长度为3。,6.2.2 连接字符串,字符串连接是程序中经常进行的操作,用来将多个字符串连接在一起形成一个字符
6、串。字符串连接使用+(加法)运算符进行。在Java语言中,采用+运算符还可以直接连接字符串和基本数据类型中的数值类型。此时,+运算符是作为字符串连接操作处理,其他数值类型自动转换为字符串。 说明:在字符连接中,Java语言实际是实现了对+运算符的重载。+运算符提供的不再是数值计算中的加法功能,而是字符串的连接功能。,6.2.3 比较字符串,在实际编程过程中,经常需要对两个字符串变量的内容进行比较。Java语言中的String类提供了几个方法分别适合不同情况的字符串比较,如表6-1所示。 注意:比较字符串值是否相等不能使用= =。当用= =来比较两个对象时,实际的运算是判断是否为同一个对象。即使
7、内容相等,如果为不同的对象,也就是对应的是不同内存地址,返回值也为false。,6.2.4 字符串其他常用操作,字符串String作为数组和类,本身提供了许多方法用来进行各种复杂操作。表6-2列出了字符串一些常用方法及简单说明。 字符串的操作方法很多,上面仅列出了一些常用的,实际编程过程中可以查看相关API。,6.2.5 StringBuffer类,String对象的长度是不可改变的,如果使用String类频繁地进行字符串拼接操作,那么会产生很多对象。针对此类性能问题,Java语言提供了另一个类StringBuffer可以特别用来处理此类问题。StringBuffer类主要包含如下一些常用方法
8、,如表6-3所示。,6.3 不同类型的数据集合,集合是多个对象的容器,容器里聚集了一组对象。前面介绍了数组类型,数组类型是有相同数据类型的数据集合。如果需要将不同数据类型的多个对象组织在一起,就需要使用集合。在Java语言中,集合本身是一个框架体系,包含各种集合类。下面分别进行介绍。,6.3.1 集合的基础集合框架,在Java语言中,各种集合类通过集合框架进行组织。集合框架包括各类集合接口、接口实现类、集合操作,通过继承关系形成自上而下的体系结构。集合框架的核心接口为Collection、List、Set和Map,其继承关系如图6.11所示。,6.3.1 集合的基础集合框架,从图中可以看出,L
9、ist和Set继承了Collection,Map则独成一体。下面对这几类接口做简单介绍。 Collection接口是Java集合框架的最顶层接口。Collection中存放的对象允许重复,没有顺序。Collection接口定义了一系列的操作集合中元素的基本方法。具体可以参考JDK API文档。 List接口继承自Collection接口。List提供了对象的有序存放,其中存放的对象也允许重复。在Collection接口定义的方法基础上,List接口进行了扩展,定义了一些与顺序操作相关的方法。 Set接口也继承自Collection接口。Set更像数学概念中的集合,存放的对象不允许重复,也没有顺
10、序。Set接口没有对Collection接口进行扩展。,6.3.1 集合的基础集合框架,从图上也能看出,Map接口是相对独立的。Map提供了一种“键-值”对映射的方式存放对象。Map接口定义了一组专门的处理该结构数据的方法。具体可以参考JDK API文档。 Java语言的集合框架极大地方便了程序开发,具有很多优越性。集合框架内置了许多有用的数据结构和算法,用户只需集中精力在程序的重要部分上。这些数据结构和算法都通过了大量的实践验证,具有较高的性能和质量,用户只要调用即可获得很好的服务。另外,在某些程度上,集合框架也提高了软件的重用性、稳定性。,6.3.2 访问集合元素,对所有集合类最经常的操作
11、就是访问集合中的元素。在Java语言中定义了迭代器Iterator接口用于访问集合中的元素。下面列出了Iterator接口中定义的方法,如表6-4所示。 在具体使用过程中,首先需要获得集合类的迭代器Iterator,然后利用迭代器反复迭代获得每一个元素。迭代器的具体使用在这里不再举例,请参考下面介绍的集合类的示例。,6.3.3 有序存放列表(List),List提供了对象的有序存放,其中存放的对象允许重复。List接口的具体实现类主要有ArrayList和LinkedList。其中ArrayList以一种类似数组的形式存储对象,对象的随机访问速度较快。LinkedList实现机制是采用链表,适
12、合于在链表中间需要频繁进行插入和删除对象的操作。在实际的编程过程中,可以根据具体需要进行相应选择。,6.3.4 无序不重复集合(Set),Set中存放的对象不允许重复,没有顺序。Set接口的具体实现类有HashSet和TreeSet。其中HashSet能快速定位一个元素,但是放到HashSet中的对象需要实现hashCode()方法。TreeSet将放入其中的元素按顺序存放,要求放入其中的对象是可排序的。,6.3.5 键值对应映射(Map),Map提供了一种“键-值”对映射的方式存放对象。其中键和值也都可以是对象。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复。这就保证了键的
13、唯一性,可以根据键对象快速定位值对象。对于值对象来说,则没有唯一性的要求,可以将任意多个键都映射到一个值对象上。Map接口的具体实现类有HashMap和TreeMap。其中HashMap也用到了哈希码的算法,以便快速查找一个键。TreeMap则是对键按序存放,要求放入其中的对象是可排序的。,6.4 增强for循环,在J2SE 5.0 版本以后,Java语言为迭代集合和数组提供了增强的for循环。增强的for循环提供了一个简单、兼容的语法,采用for-each语句形式。增强for循环的语法格式如图6.12所示。 其中,参数type表示数组或集合元素的数据类型。参数elementName表示元素名
14、称,可以由用户任意定义,但需要符合Java标识符的命名规范。参数array表示要迭代的数组,而collection表示要迭代的集合,应该为两者之一。,6.5 泛 型,泛型是J2SE 5.0版本中引入的最大特性,使用泛型编写的程序具有更好的安全性和可读性。泛型的使用范围很广,可以应用于集合类、定义泛型类、泛型方法等,下面对泛型的使用进行详细介绍。,6.5.1 泛型在集合中的应用,泛型对集合类来说有着非常重要的作用。在集合中引入泛型,能够提供编译时的类型安全,并且从集合中取得元素后不必再强制转换,简化了程序代码。定义泛型集合的语法格式如图6.13所示。 其中,参数CollectionType表示集
15、合类型,可以为任意List、Set、Map等集合类型。参数为泛型标识。参数datatype表示集合元素的数据类型,可以是Java语言中的各种数据类型。参数collectionName表示集合名称,可以由用户任意定义,但需要符合Java标识符的命名规范。,6.5.2 定义泛型类,泛型类是指包含类型参数的类。在泛型类的内部,类型参数可以用作变量的类型或方法返回参数的类型。另外,一个泛型类可以包含多个类型参数。定义泛型类的语法格式如图6.14所示。,6.5.3 创建泛型方法,与泛型类类似,包含类型参数的方法即为泛型方法。同样,一个泛型方法也可以包含多个类型参数。定义泛型方法的语法格式如图6.15所示
16、。,6.5.4 使用泛型通配符,泛型一个重要的特点是可以使用“?”作为通配符,以此来匹配任何数据类型。泛型通配符的格式如下所示。 因为Object是所有对象类型的父类(包括String),所以想象中List也应该为List的父类,那么上述代码应该没有问题。实际情况却不是这样,编译该程序时系统给出“Type mismatch: cannot convert from List to List”错误。原来对于泛型来说,因为其类型是可变的,List是其他List父类的说法已经不再成立。那么什么是List的父类呢?答案就是包含通配符的List。,6.6 常量集合枚举,枚举也是从J2SE 5.0版本开始
17、引入的新特性,可以说是继类、接口之后引入的一种全新的“类”。枚举类型是一个常量集合的数据类型,Java专门引入了“enum”关键字来表示枚举。对于枚举的定义和使用,下面分别进行详细介绍。,6.6.1 定义枚举,枚举的定义很简单,与类的定义很相似。定义枚举的语法格式如下所示。 其中,参数Modifier表示枚举修饰符,与类的修饰符一样,可以是public、private等。参数enum为关键字。参数enumName表示枚举名称,可以由用户任意定义,但需要符合Java标识符的命名规范。参数enumInstanceList表示枚举实例列表,多个实例之间用逗号分隔。另外,枚举中也可以定义方法,形式同类
18、方法一样。,6.6.2 使用枚举,在Java语言中,所有枚举类都是java.lang.Enum的子类。Enum类提供了values()和valueOf()方法用来访问枚举值。,6.6.3 枚举带来的变化,引入枚举类型以后,对于以前的一些处理方法采用枚举来实现变得更加方便。 (1)枚举类型是一个常量集合的数据类型。在引入枚举之前,类似枚举的结构更多的是用类似“public static final int”的语句进行实现。 引入枚举之后,对以前定义形式的最明显改进是类型安全。和int不同,不能错误地用枚举的一种类型代替另一种类型,而所有的int对编译器来说都是一样的。除去极少数例外的情况,通常都应该用enum实例替换全部的枚举风格的int结构。 (2)引入枚举类型之后,产生的另一个影响是switch语句。有了枚举以后,switch语句的类型不再只能是byte、char、short、int类的数值型,而是可以为枚举。枚举与switch语句的结合使用,使得程序变得更加简洁。,6.7 自动装箱和拆箱,自动装箱和拆箱是J2SE 5.0版本以后引入的新特性,用于解决Java语言基本数据类型与包装数据类型之间的转换问题。下面首先介绍一下包装类型,然后再介绍装箱与拆箱。,6.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中历史知识课件
- 辅警交通安全培训课件
- 《GAT 752-2008公安无线专网数据传输空中信令》专题研究报告
- 车站安检员培训课件
- 鉴真东渡等史实为例,说明唐代中外文化交流的发展
- 2026重庆市永川区五间镇人民政府招聘公益性岗位人员1人备考题库带答案详解
- 刑事侦查技术
- 水下探测技术
- 2026超硬材料产业技术研究院校园招聘45人备考题库及完整答案详解1套
- 阿牛巴流量计课件培训
- 2026年药店培训计划试题及答案
- 2026春招:中国烟草真题及答案
- 六年级寒假家长会课件
- 物流铁路专用线工程节能评估报告
- 2026河南省气象部门招聘应届高校毕业生14人(第2号)参考题库附答案
- 2026天津市南开区卫生健康系统招聘事业单位60人(含高层次人才)备考核心试题附答案解析
- 2025江苏无锡市宜兴市部分机关事业单位招聘编外人员40人(A类)备考笔试试题及答案解析
- 卵巢过度刺激征课件
- 汉服行业市场壁垒分析报告
- 重睑手术知情同意书
- 2026华润燃气校园招聘(公共基础知识)综合能力测试题附答案解析
评论
0/150
提交评论