1、学习内容 集合框架的概念集合框架的概念Java语言中的集合语言中的集合Collection接口接口Set接口接口List接口接口Map接口接口目标 掌握集合框架包含的内容 掌握ArrayList和LinkedList的使用 掌握HashMap的使用 掌握Iterator的使用 掌握泛型集合的使用学员1学员20如何存储每天的新闻信息?如何存储每天的新闻信息?如何存储计算机专业课程的代码与课程信息,能如何存储计算机专业课程的代码与课程信息,能够通过代码方便地获得课程信息?够通过代码方便地获得课程信息?如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储如果并不知道程序运行时会需要多少对象,
2、或者需要更复杂方式存储对象对象可以使用可以使用Java集合框架集合框架一维数组一维数组代码1代码N课程1课程N一一对应一一对应新闻1新闻N每天的新闻总数不每天的新闻总数不确定,太少浪费空确定,太少浪费空间,太多空间不足间,太多空间不足存储一个班学员信息,假定一个班容纳存储一个班学员信息,假定一个班容纳20名学员名学员为什么使用集合框架 集合类概述 集合类的作用:Java的集合类提供了一些基本数据结构的支持。例如Vector、Hashtable、Stack等。集合类的使用:Java的集合类包含在java.util包中。import java.util.*;集合类概述 集合类特点一:只容纳对象。这
3、一点和数组不同,数组可以容纳基本数据类型数据和对象。如果集合类中想使用基本数据类型,又想利用集合类的灵活性,可以把基本数据类型数据封装成该数据类型的对象,然后放入集合中处理。集合类概述 集合类特点二:集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,这样设 计的目的是为了集合类的通用性。因为Object类是所有类的祖先,所以可以在这些集合中存放任何类的对象而不受限制,但是切记在使用集合成员之前必须对它重新造型。什么是集合框架的概念什么是集合框架的概念 集合框架:是为表示和操作集合而规定的一种统一的、集合框架:是为表示和操作集合而规定的一种统一的、标准的体系
4、结构。标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。实现和对集合运算的算法。接口:即表示集合的抽象数据类型。接口提供了让我们对集合接口:即表示集合的抽象数据类型。接口提供了让我们对集合中所表示的内容进行单独操作的可能。中所表示的内容进行单独操作的可能。实现:也就是集合框架中接口的具体实现。实际它们就是那些实现:也就是集合框架中接口的具体实现。实际它们就是那些可复用的数据结构。可复用的数据结构。算法:在一个实现了某个集合框架中的接口的对象上,完成某算法:在一个实现了某个集合框架中的接口的对象上,完成某种有用
5、的计算的方法,例如查找、排序等。种有用的计算的方法,例如查找、排序等。集合框架对编程有什么好处呢?集合框架对编程有什么好处呢?提高程序设计效率。提高程序设计效率。提高程序速度和质量。集合框架通过提供对有用的提高程序速度和质量。集合框架通过提供对有用的数据结构和算法的高性能和高质量的实现使你的程数据结构和算法的高性能和高质量的实现使你的程序速度和质量得到提高。序速度和质量得到提高。集合框架鼓励软件的复用。对于遵照标准集合框架集合框架鼓励软件的复用。对于遵照标准集合框架接口的新的数据结构是可复用的。接口的新的数据结构是可复用的。1接口接口CollectionListMap2具体类具体类ArrayL
6、istLinkedListHashMap3算法算法Java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们集合框架为我们提供了一套性能优良、使用方便的接口和类,它们位于位于java.util包中包中我们不必再重新发明轮子,只需学会如何使用它们,就可处理实际应用中我们不必再重新发明轮子,只需学会如何使用它们,就可处理实际应用中问题问题 Collections提供了对集合进行排序、提供了对集合进行排序、遍历等多种算法实现遍历等多种算法实现Java集合框架包含的内容SetTreeSetHashSetTreeMapJava集合框架包含的内容 Collection 接口存储一组不唯一,无序的对
7、象 List 接口存储一组不唯一,有序(插入顺序)的对象 Set 接口存储一组唯一,无序的对象 Map接口存储一组键值对象,提供key到value的映射 CollectionListMapSetList接口的实现类 ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高 LinkedList采用链表存储方式。插入、删除元素时效率比较高ListArrayListLinkedListList List的明显特征是它的元素都有一个确定的顺序。实现它的类有ArrayList和LinkedList。ArrayList内存中是顺序存储的。LinkedList内存
8、中是以链表方式存储的。2114List(列表列表)0123ArrayList集合类 存储多条狗狗信息,获取狗狗总数,逐条打印出各条狗狗信息 通过List接口的实现类ArrayList实现该需求 元素个数不确定 要求获得元素的实际个数 按照存储顺序获取并打印元素信息ArrayList集合类public class Test1 public static void main(String args)Dog ououDog=new Dog(欧欧欧欧,雪娜瑞雪娜瑞);Dog yayaDog=new Dog(亚亚亚亚,拉布拉多拉布拉多);Dog meimeiDog=new Dog(美美美美,雪娜瑞雪娜瑞
9、);Dog feifeiDog=new Dog(菲菲菲菲,拉布拉多拉布拉多);List dogs=new ArrayList();dogs.add(ououDog);dogs.add(yayaDog);dogs.add(meimeiDog);dogs.add(2,feifeiDog);/添加添加feifeiDog到指定位置到指定位置System.out.println(共计有共计有+dogs.size()+条狗狗。条狗狗。);System.out.println(分别是:分别是:);for(int i=0;i dogs.size();i+)Dog dog=(Dog)dogs.get(i);Sy
10、stem.out.println(dog.getName()+t+dog.getStrain();创建创建ArrayList对象并把四个对象并把四个狗狗对象放入其中狗狗对象放入其中输出狗狗的数量输出狗狗的数量获取第获取第i i个元素个元素 ArrayList举例import java.util.*;public class ArrayListDemo public static void main(String argv)ArrayList al=new ArrayList();/Add lots of elements to the ArrayList.al.add(new Integer(
11、11);al.add(new Integer(12);al.add(new Integer(13);al.add(new String(hello);/First print them out using a for loop.System.out.println(Retrieving by index:);for(int i=0;ial.size();i+)System.out.println(Element +i+=+al.get(i);LinkedList类举例:import java.util.*;public class LinkedListDemo public static vo
12、id main(String argv)LinkedList l=new LinkedList();l.add(new Object();l.add(Hello);l.add(zhangsan);ListIterator li=l.listIterator(0);while(li.hasNext()System.out.println(li.next();if(l.indexOf(Hello)0)System.err.println(Lookup does not work);else System.err.println(Lookup works);补充练习一 功能描述:使用ArrayLis
13、t类保存饭店信息,创建三个饭店的对象保存到ArrayList中,然后遍历集合输出显示,当一个饭店从ArrayList中删除后,重新输出剩下的饭店集合,效果如下图所示补充案例二 创建一个类Cat 包含属性name,在构造方法中进行初始化 添加一个方法show(),用以打印name属性的值 创建一个类CatTest,添加main方法,实现 创建一个ArrayList,向其中添加几个Cat对象 遍历该集合,并且对每个Cat对象调用show()方法 ArrayList集合类 扩充以下几部分功能 删除指定位置的狗狗,如第一个狗狗 删除指定的狗狗,如删除feifeiDog对象 判断集合中是否包含指定狗狗
14、List接口提供相应方法remove()、contains(),直接使用即可 ArrayList集合类public class Test2 public static void main(String args)/1、创建多个狗狗对象、创建多个狗狗对象/2、创建、创建ArrayList集合对象并把多个狗狗对象放入其中集合对象并把多个狗狗对象放入其中System.out.println(删除之前共计有删除之前共计有+dogs.size()+条狗狗。条狗狗。);dogs.remove(0);dogs.remove(feifeiDog);System.out.println(n删除之后还有删除之后还
15、有+dogs.size()+条狗狗。条狗狗。);if(dogs.contains(meimeiDog)System.out.println(n集合中包含美美的信息集合中包含美美的信息);elseSystem.out.println(n集合中不包含美美的信息集合中不包含美美的信息);删除第一个狗狗和删除第一个狗狗和feifeiDog判断是否包含指定狗狗判断是否包含指定狗狗ArrayList集合类 List接口常用方法 方法名方法名说说 明明boolean add(Object o)在列表的末尾顺序添加元素,起始索引位置从0开始void add(int index,Object o)在指定的索引位
16、置添加元素。索引位置必须介于0和列表中元素个数之间int size()返回列表中的元素个数Object get(int index)返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换boolean contains(Object o)判断列表中是否存在指定元素boolean remove(Object o)从列表中删除元素Object remove(int index)从列表中删除指定位置元素,起始索引位置从0开始LinkedList集合类 在集合任何位置(头部、中间、尾部)添加、获取、删除狗狗对象 插入、删除操作频繁时,可使用LinkedList来提高效率 L
17、inkedList还额外提供对头部和尾部元素进行添加和删除操作的方法 LinkedList集合类3-2public class Test3 public static void main(String args)/创建多个狗狗对象创建多个狗狗对象LinkedList dogs=new LinkedList();dogs.add(ououDog);dogs.add(yayaDog);dogs.addLast(meimeiDog);dogs.addFirst(feifeiDog);Dog dogFirst=(Dog)dogs.getFirst();System.out.println(第一条狗狗昵
18、称是第一条狗狗昵称是+dogFirst.getName();Dog dogLast=(Dog)dogs.getLast();System.out.println(最后一条狗狗昵称是最后一条狗狗昵称是+dogLast.getName();dogs.removeFirst();dogs.removeLast();创建创建LinkedList集合对象并把集合对象并把多个狗狗对象放入其中多个狗狗对象放入其中获取第一条狗狗信息获取第一条狗狗信息获取最后一条狗狗信息获取最后一条狗狗信息删除第一个狗狗和最后删除第一个狗狗和最后一个狗狗一个狗狗LinkedList集合类 LinkedList的特殊方法方法名方
19、法名说说 明明voidaddFirst(Object o)在列表的首部添加元素voidaddLast(Object o)在列表的末尾添加元素Object getFirst()返回列表中的第一个元素Object getLast()返回列表中的最后一个元素Object removeFirst()删除并返回列表中的第一个元素Object removeLast()删除并返回列表中的最后一个元素补充练习三 功能描述:使用LinkedList保存人员信息,并调用相关方法实现输出显示。效果如图所示:补充案例四 创建一个类Stack,代表堆栈(其特点为:后进先出),添加方法add(Object obj)、以及
20、delete(),添加main方法进行验证,要求:使用LinkedList实现堆栈 在向LinkedList中添加时,使用addLast()方法 在从LinkedList中取出时,使用removeLast()方法集合框架中的接口集合框架中的接口 Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。Set:不能包含重复的元素。SortedSet是一个按照升序排列元素的Set。List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。Map:包含了key-value对。Map不能包含重复的key。SortedMap是一个按照升序排列key的Map。Colle
21、ctionSet Set中的元素必须唯一。添加到Set中的元素必须定义equals方法,以提供算法来判断欲添加进来的对象是否与已经存在的某对象相等,从而建立对象的唯一性。实现Set接口的类有HashSet,TreeSet。4627351Set集集SetSet举例import java.util.*;public class SetDemo public static void main(String argv)HashSet h=new HashSet();/也可以 Set h=new HashSet()h.add(One);h.add(Two);h.add(One);/DUPLICATE h
22、.add(Three);Iterator it=h.iterator();while(it.hasNext()System.out.println(it.next();Map接口 建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作,应该如何实现数据的存储和操作呢?Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作 最常用的实现类是HashMap Map接口3-2 public class Test4 public static void main(String args)Map countries=new HashMap();countries.put(CN,
23、中华人民共和国中华人民共和国);countries.put(RU,俄罗斯联邦俄罗斯联邦);countries.put(FR,法兰西共和国法兰西共和国);countries.put(US,美利坚合众国美利坚合众国);String country=(String)countries.get(CN);System.out.println(CN对应的国家是:对应的国家是:+country);System.out.println(Map中共有中共有+countries.size()+组数据组数据);countries.remove(FR);System.out.println(Map中包含中包含FR的的
24、key吗?吗?+countries.containsKey(FR);System.out.println(countries.keySet();System.out.println(countries.values();System.out.println(countries);使用使用HashMap存储多存储多组键值对组键值对获取获取Map元素个数元素个数删除指定元素,判断是删除指定元素,判断是否包含指定元素否包含指定元素显示键集、值集和键值对集显示键集、值集和键值对集获取指定元素的值获取指定元素的值Map接口 Map接口常用方法方法名方法名说说 明明Object put(Object ke
25、y,Object val)以“键-值对”的方式进行存储Object get(Object key)根据键返回相关联的值,如果不存在指定的键,返回nullObject remove(Object key)删除由指定的键映射的“键-值对”int size()返回元素个数Set keySet()返回键的集合Collection values()返回值的集合booleancontainsKey(Object key)如果存在由指定的键映射的“键-值对”,返回true集合类对比 Vector和ArrayList的异同 实现原理相同,功能相同,很多情况下可以互用 两者的主要区别如下 Vector线程安全,
26、ArrayList重速度轻安全,线程非安全 长度需增长时,Vector默认增长一倍,ArrayList增长50%Hashtable和HashMap的异同 实现原理相同,功能相同,在很多情况下可以互用 两者的主要区别如下 Hashtable继承Dictionary类,HashMap实现Map接口 Hashtable线程安全,HashMap线程非安全 Hashtable不允许null值,HashMap允许null值开发过程中,最好使用开发过程中,最好使用ArrayList和和HashMap练习根据宠物昵称查找宠物 需求说明:根据宠物昵称查找对应宠物,如果找到,显示宠物信息,否则给出错误提示 迭代器
27、Iterator 如何遍历List集合呢?方法1:通过for循环和get()方法配合实现遍历 方法2:通过迭代器Iterator实现遍历 所有集合接口和类都没有提供相应遍历方法,而是由Iterator实现集合遍历 Collection 接口的iterate()方法返回一个Iterator,然后通过Iterator接口的两个方法可实现遍历 boolean hasNext():判断是否存在另一个可访问的元素 Object next():返回要访问的下一个元素迭代器Iterator2-2public class Test5 public static void main(String args)/1
28、、创建多个狗狗对象、创建多个狗狗对象Dog ououDog=new Dog(欧欧欧欧,雪娜瑞雪娜瑞);/2、创建、创建ArrayList集合对象并把多个狗狗对象放入其中集合对象并把多个狗狗对象放入其中List dogs=new ArrayList();dogs.add(ououDog);System.out.println(使用使用Iterator遍历,所有狗狗昵称和品种是遍历,所有狗狗昵称和品种是:);Iterator it=dogs.iterator();while(it.hasNext()Dog dog=(Dog)it.next();System.out.println(dog.getN
29、ame()+t+dog.getStrain();通过迭代器依次输出所通过迭代器依次输出所有狗狗的信息有狗狗的信息练习迭代List中企鹅信息 需求说明:使用ArrayList和LinkedList存储多个企鹅信息,然后统一使用Iterator进行遍历 泛型集合 把任何类型对象通过add(Object obj)放入List中,认为只是Object类型 通过get(int index)取出List中元素时必须进行强制类型转换,繁琐而且容易出现异常 使用Map的put(Object key,Object value)和get(Object key)存取对象时存在同样问题 使用Iterator的next
30、()方法获取元素时存在同样问题 JDK5.0中通过引入泛型有效的解决了这个问题 JDK5.0使用泛型改写了集合框架中的所有接口和类泛型集合3-2public class Test6 public static void main(String args)/1、创建多个狗狗对象、创建多个狗狗对象Dog dog1=new Dog(欧欧欧欧,雪娜瑞雪娜瑞);/2、创建、创建ArrayList集合对象并把多个狗狗对象放入其中集合对象并把多个狗狗对象放入其中List dogs=new ArrayList();dogs.add(dog1);/dogs.add(hello);/3、显示第三个元素的信息显示第
31、三个元素的信息Dog dog=dogs.get(2);System.out.println(第三个狗狗的信息如下:第三个狗狗的信息如下:);System.out.println(dog.getName()+t+dog.getStrain();/4、使用、使用Iterator遍历遍历dogs对象对象System.out.println(n所有狗狗的信息如下:所有狗狗的信息如下:);Iterator it=dogs.iterator();while(it.hasNext()dog=it.next();System.out.println(dog.getName()+t+dog.getStrain(
32、);标记元素类型标记元素类型标记元素类型标记元素类型类型不符,出类型不符,出现编译错误现编译错误无需类型强制转换无需类型强制转换(Dog)Dogs.get(2);标记元素类型标记元素类型无需类型强制转换无需类型强制转换(Dog)it.next();泛型集合public class Test7 public static void main(String args)/1、使用、使用HashMap存储多组国家英文简称和中文全称的键值对存储多组国家英文简称和中文全称的键值对Map countries=new HashMap();countries.put(CN,中华人民共和国中华人民共和国);cou
33、ntries.put(RU,俄罗斯联邦俄罗斯联邦);countries.put(FR,法兰西共和国法兰西共和国);/2、显示、显示CN对应国家的中文全称对应国家的中文全称String country=countries.get(CN);System.out.println(CN对应的国家是:对应的国家是:+country);标记键标记键-值类型值类型无需类型强制转换无需类型强制转换(String)countries.get(CN);标记键标记键-值类型值类型总结 Collection、List、Set、Map接口的联系和区别有哪些?ArrayList和LinkedList有什么异同之处?有哪些遍历集合的方法?为什么要引入泛型集合?