集合.docx
《集合.docx》由会员分享,可在线阅读,更多相关《集合.docx(11页珍藏版)》请在冰点文库上搜索。
![集合.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/d392038b-bfd9-4da8-8e77-95b4488da04c/d392038b-bfd9-4da8-8e77-95b4488da04c1.gif)
集合
Java语言的集合
一、集合基本内容介绍
1.概念
集合可理解为一个容器,该容器主要指映射、集合、列表、数组和散列表等抽象数据结构。
容器包含有多个元素,这些元素通常是一些Java对象。
集合框架是针对上述抽象数据结构所定义的一些标准编程接口,主要是由一组精心设计的接口、类和隐含在其中的算法所组成,通过它们可以采用集合的方式完成对Java对象的存储、获取、操作以及转换等功能。
2.Arrays类
Arrays(数组)类是集合框架的一个成员类,其提供的功能主要对数组对象进行排序、搜索和填充操作。
Arrays类所提供的方法都是静态方法,可以直接通过类名加以引用。
Arrays类可以对Object,byte,short,int,long,float,double,char等类型的数组完成上述操作。
3.基本的集合接口
基本的集合接口是指Collection接口、List接口、Set接口和Map接口。
4.集合
集合(Set)是指一个不包含重复元素的对象集合,是数学上“集合”概念的一种抽象。
基于这样的概念,集合接口所定义的方法主要分为两类,一是集合和元素之间的方法;二是集合之间的方法。
HashSet类所创建的是一个无序的集合对象。
当需要从集合中有序地获取元素时,需TreeSet类来建立集合对象,需注意的是添加到TreeSet中的元素必须是可排序的。
5.列表
列表(List)是指一个有序的对象集合,也称为一个对象序列。
通过列表接口,可以利用整数索引(即元素在列表中的位置)对列表中的每个元素有准确的控制,包括访问特定位置的元素对象和查询特定的元素。
ArrayList类是通过数组方式来实现的,LinkedList类是通过链表结构来实现。
由于这两个类的实现方式不同,使得相关操作方法的代价也不相同。
一般说来,若对一个列表结构的开始和结束处有频繁地添加和删除操作时,较为理想的是选用LinkedList类所实例化的对象表示该列表,通常LinkedList对象表示堆栈或队列。
6.映射
映射(Map)接口是与Collection接口相并列的一个接口,该接口描述了不重复的键到值的映射。
一个映射对象中不能包含重复的键,且每个键只能映射到一个值。
HashMap类和TreeMap类是集合框架提供的Map接口的实现类。
在Map中插入、删除和定位元素,HashMap是最好的选择。
但如果需要按顺序遍历键,那么需选择TreeMap。
7.Collection类
Collection类提供了一些静态方法,通过这些静态方法可以对集合对象进行操作或返回集合对象。
8.枚举和迭代
枚举和迭代的功能是将一个集合对象中所有元素顺序列举出来,它们分别是由Enumeration接口和Iterator接口所定义。
两者之间既有相同之处,也存在不同。
目前Java语言编程中推荐用Iterator接口代替Enumeration接口。
9.历史集合类
历史集合类所指是在Java标准版1.2之间所定义的上些对集合进行操作的类定义,它们是Vector类、Dictionary类和Hashtable类。
二、程序举例
例1.Arrays类的排序实例
importjava.util.Arrays;
publicclassArraysDemo{
publicstaticvoidmain(String[]args){
String[]strings={"wall","parent","mother","grand","rain","sorry"};
Arrays.sort(strings);
for(inti=0;iSystem.out.println(strings[i]);
}
}
程序运行结果:
grand
mother
parent
rain
sorry
wall
程序分析:
Arrays类的sort()方法是静态方法,可直接通过类名加以引用。
sort()方法默认升序排列。
请查API文档了解Arrays类及sort()方法。
例2.Vector类的简单应用
importjava.util.*;
publicclassVectorDemo{
publicstaticvoidmain(String[]args){
Vectorv=newVector();
v.add("苹果");
v.add(0,"香蕉");
v.add("芒果");
v.add("梨子");
v.add(1,"葡萄");
System.out.println(v);
Stringname=(String)v.get(3);
System.out.println(name);
}
}
程序执行结果:
[香蕉,葡萄,苹果,芒果,梨子]
芒果
程序分析:
Vector对象的创建、对象添加、对象获取和结果打印是该程序学习的重点。
例8.3利用Collection类给集合对象排序。
importjava.util.Vector;
importjava.util.Collections;
publicclassCollectionsDemo{
publicstaticvoidmain(String[]args){
Vectorv=newVector();
v.add("wall");
v.add("parent");
v.add("mother");
v.add("grand");
v.add("rain");
v.add("sorry");
Collections.sort(v);//Collections类的sort()方法是静态方法,可直接通过类名加以引用。
//sort()方法的默认排序规则是按字母顺序。
for(inti=0;iSystem.out.println(v.elementAt(i));
}
}
程序运行结果:
grand
mother
parent
rain
sorry
wall
例8.4利用Collection类给集合对象排序。
importjava.util.Comparator;
importjava.util.Arrays;
publicclassCompareDemo{
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
String[]strings={"wall","parent","mother","grand","rain","sorry"};
Arrays.sort(strings);
print(strings,"默认排序");
System.out.println();
//Arrays类的sort()方法可根据所定义比较器的不同,有不同的排序结果。
Arrays.sort(strings,newConvertComparator());
print(strings,"反向排序");
}
staticvoidprint(String[]args,Stringtitle){
System.out.println(title);
for(inti=0;iSystem.out.println(args[i]);
}}
//比较器实现了Comparator接口,定义了compare()方法。
classConvertComparatorimplementsComparator
publicintcompare(Objectb1,Objectb2)
{
Strings1=(String)b1;
Strings2=(String)b2;
returnpareTo(s1);
}
}
程序运行结果:
默认排序
grand
mother
parent
rain
sorry
wall
反向排序
wall
sorry
rain
parent
mother
grand
例8.5将ArrayList对象转换为一个数组对象
importjava.util.*;
publicclassToArray{
publicstaticvoidmain(String[]args){
ArrayList
a1.add("wall");
a1.add("parent");
a1.add("mother");
a1.add("grand");
a1.add("rain");
a1.add("sorry");
//ArrayList对象的toArray()方法可将其所包含的元素转换到一个数组中。
Object[]b1=a1.toArray();
System.out.println("ArrayofObjecthaslength"+b1.length);
//ArrayList对象被转换为一个字符数组,用到了强制类型转换。
String[]s1=(String[])a1.toArray(newString[0]);
System.out.println("ArrayofStringhaslength"+s1.length);
for(inti=0;iSystem.out.println(s1[i]);
}
}
程序运行结果:
ArrayofObjecthaslength6
ArrayofStringhaslength6
wall
parent
mother
grand
rain
sorry
例8.6利用HashMap保存复合对象
importjava.io.*;
importjava.util.*;
publicclassStudent{
privateStringid;
privateStringname;
privateintphoneNumber;
Student(StringaId,StringaName,intphone)
{
id=aId;
name=aName;
phoneNumber=phone;
}
publicStringtoString(){
return(id+":
"+name+":
"+phoneNumber);
}
publicstaticStringreadString(Strings)throwsIOException{
System.out.println(s);
BufferedReaderbuf=newBufferedReader(newInputStreamReader(System.in));
//对标准输入流进行包装获得了缓冲输入流对象,目的是使用其readLine()方法,读取一行输入内容。
returnbuf.readLine();
}
publicstaticintreadInt(Strings)throwsIOException,NumberFormatException{
System.out.println(s);
BufferedReaderbuf=newBufferedReader(newInputStreamReader(System.in));
Stringline=buf.readLine();
returnInteger.parseInt(line);
}
publicstaticvoidmain(String[]args){
Mapstudents=newHashMap();
//HashMap中所保存的是以学生的学号为键、学生对象为值而构成的映射结构。
Studentbill=newStudent("001","张晓",2345656);
students.put(bill.id,bill);
try{
intnumOfstudents=readInt("Howmanystudents?
");
Studentstd;
for(inti=0;istd=newStudent(readString("EnterstudentID:
"),readString("EnterstudentName:
"),readInt("Enterphonenumber:
"));
students.put(std.id,std);
}
System.out.println("Studentsstoredinmapobject");
System.out.println(students);
System.out.println("\nSearchastudent");
System.out.println(students.get(readString("Enterastudentid")));
}catch(IOExceptione){
System.out.println("inputerror");
System.out.println(e.getMessage());
}catch(NumberFormatExceptione1){
System.out.println("inputerror");
System.out.println(e1.getMessage());
}
}
}
程序执行结果:
Howmanystudents?
2
EnterstudentID:
001
EnterstudentName:
李明
Enterphonenumber:
123456
EnterstudentID:
002
EnterstudentName:
张三
Enterphonenumber:
234567
Studentsstoredinmapobject
{001=001:
李明:
123456,002=002:
张三:
234567}
Searchastudent
Enterastudentid
001
001:
李明:
123456