集合类_补充案例.doc

上传人:牧羊曲112 文档编号:3965740 上传时间:2023-03-29 格式:DOC 页数:29 大小:194KB
返回 下载 相关 举报
集合类_补充案例.doc_第1页
第1页 / 共29页
集合类_补充案例.doc_第2页
第2页 / 共29页
集合类_补充案例.doc_第3页
第3页 / 共29页
集合类_补充案例.doc_第4页
第4页 / 共29页
集合类_补充案例.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《集合类_补充案例.doc》由会员分享,可在线阅读,更多相关《集合类_补充案例.doc(29页珍藏版)》请在三一办公上搜索。

1、第七章 集合案例7-1 Collection接口对集合的操作一、案例描述 1、 考核知识点编号:00107002名称:Collection接口2、 练习目标 掌握Collection接口中方法的使用3、 需求分析Collection是所有单列集合的父接口,在Collection中定义了单列集合(List和Set)通用的一些方法。为了让初学者熟悉Collection接口中的常用方法,本案例将演示Collection接口中的方法对集合进行操作来学习方法的使用。4、 设计思路(实现原理)1) 编写一个类Example012) 在类中定义两个Collection集合,并向其中一个集合中添加数据3) 用

2、Collection接口中的方法对定义的两个集合进行各种操作二、案例实现import java.util.*;public class Example01 public static void main(String args) / 定义集合Collection col1 = new ArrayList();col1.add(123abc);col1.add(123);col1.add(34.121);Collection col2 = new ArrayList();/ 判断集合是否为空boolean a = col1.isEmpty();boolean b = col2.isEmpty()

3、;col1集合是否为空:+a);col2集合是否为空:+b);/ 将集合col1中的元素添加到 col2中col2.addAll(col1);col1集合中的元素添加到 col2后,col2集合:+col2);/ 获取两个集合的交集boolean c = col1.retainAll(col2);col1和col2集合是否有交集:+c);/ 清除集合col2中的元素col2.clear();清除集合col2中的元素后,col2集合:+col2);/ 获取集合中元素的个数int size = col1.size();col1集合中元素的个数:+size);运行结果如图7-1所示。图7-1 运行结

4、果三、案例总结1、Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合,如表7-1所示。表7-1 Collection中的方法方法声明功能描述boolean add(Object o)向集合中添加一个元素boolean addAll(Collection c)将指定Collection中的所有元素添加到该集合中void clear()删除该集合中的所有元素boolean remove(Object o)删除该集合中指定的元素boolean removeAll(Collection c)删除指定

5、集合中的所有元素boolean isEmpty()判断该集合是否为空boolean contains(Object o)判断该集合中是否包含某个元素boolean containsAll(Collection c)判断该集合中是否包含指定集合中的所有元素Iterator iterator()返回在该集合的元素上进行迭代的迭代器(Iterator),用于遍历该集合所有元素int size()获取该集合元素个数2、在编译案例时,会得到如图7-2所示的警告,意思是说在使用ArrayList集合时并没有显示的指定集合中存储什么类型的元素,会产生安全隐患,这涉及到泛型安全机制的问题。此警告对程序输出结果

6、没有影响。图7-2 编译警告3、在编写程序时,不要忘记使用import java.util.*;语句导包,否则程序将会编译失败,显示类找不到。案例7-2 List接口的特有方法一、案例描述 1、 考核知识点编号:00107003名称:List接口2、 练习目标 掌握List接口的常用方法的使用3、 需求分析List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法。为了熟悉List接口中特有方法的使用,本案例将演示使用List接口中的方法对List集合进行添加、修改等操作。4、 设计思路(实现原理)1) 编写一

7、个类Example022) 在类中定义两个list集合,并向其中一个集合中添加数据。3) 用 subList(int fromIndex, int toIndex)方法获取集合的一部分4) 用set(int index, E element)方法修改一个元素5) 用add(int index, E element)方法增加一个元素二、案例实现import java.util.*;public class Example02public static void main(String args) List list = new ArrayList();list.add(abc1);/add()方

8、法添加元素list.add(abc2);list.add(abc3);list.add(abc4);List newList = list.subList(0, 2);/subList()方法获取集合的前两个元素 ; Object o = list.set(0, haha);/set()方法修改指定位置元素值为haha;list.add(0, QQ);/add()方法在集合指定位置增加一个元素QQ;运行结果如图7-3所示。图7-3 运行结果三、案例总结1、在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有

9、一个特点就是元素有序,即元素的存入顺序和取出顺序一致。2、List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如表7-2所示。表7-2 List接口中的常见方法方法声明功能描述void add(int index,Object element)将元素element插入在List集合的index处boolean addAll(int index,Collection c)将集合c所包含的所有元素插入到List集合的index处Object get(int index)返回集合索引index处的元素Obje

10、ct remove(intindex)删除index索引处的元素Object set(intindex, Objectelement)将索引index处元素替换成element对象,并将替换后的元素返回int indexOf(Objecto)返回对象o在List集合中出现的位置索引int lastIndexOf(Objecto)返回对象o在List集合中最后一次出现的位置索引List subList(intfromIndex, inttoIndex)返回从索引fromIndex(包括 )到 toIndex(不包括)处所有元素集合组成的子集合案例7-3 ArrayList集合的存取一、案例描述

11、1、 考核知识点编号:00107004名称:ArrayList集合2、 练习目标 了解ArrayList集合的特点 掌握对ArrayList集合中元素的存取操作3、 需求分析ArrayList是List接口的一个实现类,ArrayList集合中大部分方法都是从父类Collection和List继承过来的。为了熟悉ArrayList集合的使用,本案例将演示ArrayList集合的定义、存储元素和取出元素。4、 设计思路(实现原理)1) 编写一个类Example032) 在类中定义一个ArrayList集合3) 用add()方法向集合中添加元素4) 用get()方法获取集合中的指定元素,由于Arr

12、ayList集合的索引的取值范围是从0开始的,最后一个索引是size-1。所以,要获取集合中的第2个元素应该是get(1)。二、案例实现import java.util.*;public class Example03public static void main(String args) ArrayList array = new ArrayList();array.add(lisi); array.add(wangwu);array.add(jordan);array.add(jackson);array.add(white); ;第2个元素是: + array.get(1);运行结果如图

13、7-4所示。图7-4 运行结果三、案例总结1、在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。2、索引位置为1的元素是集合中的第二个元素,这就说明集合和数组一样,索引的取值范围是从0开始的,最后一个索引是size-1,在访问元素时一定要注意索引不可超出此范围,否则会抛出角标越界异常IndexOutOfBoundsException。3、由于ArrayList集合的底层是使用一个数组来保存元素,在增加或删除指定位置的元素时,会导致创建新的数组,效

14、率比较低,因此不适合做大量的增删操作。但这种数组的结构允许程序通过索引的方式来访问元素,因此使用ArrayList集合查找元素很便捷。案例7-4 LinkedList集合的特殊方法一、案例描述 1、 考核知识点编号:00107005名称:LinkedList集合2、 练习目标 了解LinkedList集合的特点 掌握LinkedList集合的特殊方法的使用3、 需求分析ArrayList集合在查询元素时速度很快,但在增删元素时效率较低,为了克服这种局限性,可以使用List接口的另一个实现类LinkedList。LinkedList集合除了对于元素的增删操作具有很高的效率,还专门针对元素的增删操

15、作定义了一些特有的方法。为了熟悉这些特殊的方法,本案例将演示如何使用LinkedList中的特殊方法对集合进行增删操作。4、 设计思路(实现原理)1) 编写一个类Example04,在该类中定义一个LinkedList集合2) 分别使用addFirst()和addLast()方法向集合中添加元素3) 使用peekFirst()方法获取集合中的第一个元素4) 使用pollFirst()方法获取并移除集合中的第一个元素5) 使用pollLast()方法获取并移除集合中的最后一个元素6) 此时,集合中应该没有元素了,用peekLast()方法获取集合中的最后一个元素,由于集合为空,应该返回NULL二

16、、案例实现import java.util.*;public class Example04 public static void main(String args) LinkedList link = new LinkedList();link.addFirst(abc1);/将指定元素插入此集合的开头link.addLast(haha);/将指定元素添加到此集合的结尾;/获取但不移除此集合的第一个元素;/获取但不移除此集合的最后一个元素;/获取并移除此集合的第一个元素;/获取并移除此集合的最后一个元素运行结果如图7-5所示。图7-5 运行结果三、案例总结1、LinkedList集合内部维护

17、了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修改元素之间的这种引用关系即可,删除一个节点也是如此。正因为这样的存储结构,所以LinkedList集合对于元素的增删操作具有很高的效率。2、在本案例中,所用的方法及其功能具体如下:1) peekFirst()方法用于获取LinkedList集合中的第一个元素,如果此列表为空则返回NULL2) peekLast()方法用于获取LinkedList集合中的最后一个元素,如果此列表为空则返回NULL3) pollFirst()方法用于获取并移除Link

18、edList集合中的第一个元素,如果此列表为空则返回NULL4) pollLast()方法用于获取并移除LinkedList集合中的最后一个元素,如果此列表为空则返回NULL5) addFirst()方法用于添加LinkedList集合中的第一个元素6) addLast()方法用于添加LinkedList集合中的最后一个元素案例7-5 Iterator遍历集合元素一、案例描述 1、 考核知识点编号:00107006名称:Iterator接口2、 练习目标 掌握Iterator迭代器的使用3、 需求分析在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口Iterat

19、or。为了使初学者熟悉Iterator迭代器的使用,本案例将演示如何使用Iterator迭代器遍历集合中的元素。4、 设计思路(实现原理)1) 编写一个类Example052) 在类中定义一个List集合,并向集合中添加数据3) 通过调用List集合的iterator()方法获得迭代器对象4) 在while循环条件中使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素二、案例实现定义Example05类,其代码如下:import java.util.*;public class Example05 publ

20、ic static void main(String args) List list = new ArrayList();list.add(abc1);/向集合中添加元素list.add(abc2);list.add(abc3);list.add(abc4);Iterator it = list.iterator(); /获取迭代器对象while (it.hasNext() /判断是否还有元素Object obj = it.next(); /取出元素;运行结果如图7-6所示。图7-6 运行结果三、案例总结1、需要注意的是,在通过next()方法获取元素时,必须保证要获取的元素存在,否则,会抛出

21、NoSuchElementException异常。2、Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,图7-7演示了Iterator对象迭代元素的过程。图7-7 遍历元素过程图案例7-6 foreach循环:简化遍历一、案例描述 1、 考核知识点编号:00107007名称:foreach循环2、 练习目标 掌握使用foreach循环遍历集合和数组3、 需求分析虽然Iterator可以用来遍历集合中的元素,但写法上比较繁琐,为了简化书写,从JDK5.0开始,提供了foreach循环。foreach循环用于遍历数组或集合中的元素。为了让初学者能熟悉foreach循环的

22、使用,本案例将演示如何用foreach循环遍历数组和集合中的元素。4、 设计思路(实现原理)1) 编写一个类Example06,2) 在该类中定义一个List集合,向集合中添加四个元素3) 用foreach循环遍历集合中的元素4) 在类中定义一个数组arr,静态初始化数组int arr = 3,2,6;5) 用foreach循环遍历arr中的元素二、案例实现import java.util.*;public class Example06 public static void main(String args) / 创建list集合List list = new ArrayList();lis

23、t.add(sv);list.add(lv);list.add(mv);list.add(tv);遍历集合中的元素:);for (Object obj : list) /foreach循环遍历集合中的元素;/ 定义数组int arr = 3, 2, 6 ;遍历数组中的元素:);for (int x : arr) /foreach循环遍历数组中的元素;运行结果如图7-8所示。图7-8 运行结果三、案例总结1、通过案例可以看出,foreach循环在遍历集合时语法非常简洁,没有循环条件,也没有迭代语句,所有这些工作都交给虚拟机去执行了。foreach循环的次数是由容器中元素的个数决定的,每次循环时,

24、foreach中都通过变量将当前循环的元素记住,从而将集合中的元素分别打印出来。2、使用foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改。案例7-7 ListIterator迭代器的特有方法一、案例描述 1、 考核知识点编号:00107008名称:ListIterator接口2、 练习目标 掌握ListIterator接口中特有方法的使用3、 需求分析ListIterator迭代器是Iterator的子类,该类在父类的基础上增加了一些特有方法。为了让初学者能熟悉ListIterator接口中特有方法的使用,本案例将演示如何用ListIterator接口中的方法

25、向集合中插入元素和逆向遍历集合。4、 设计思路(实现原理)1) 编写一个类Example072) 在该类中定义一个List集合,向集合中添加四个元素3) 用ListIterator接口的add()方法向集合中插入一个元素并遍历集合list4) 用ListIterator接口的boolean hasPrevious()方法逆向遍历集合二、案例实现import java.util.*;public class Example07 public static void main(String args) List list = new ArrayList();list.add(abc1);list.

26、add(abc2);list.add(abc3);list.add(abc4);ListIterator lit = list.listIterator();while (lit.hasNext() Object o = lit.next();/ 遍历到abc4元素时,向集合中添加一个元素if (abc4.equals(o) lit.add(abc5);/ 逆向遍历集合以下是逆向遍历);while (lit.hasPrevious() ;运行结果如图7-9所示。图7-9 运行结果三、案例总结1、ListIterator迭代器的特有方法,如表7-3所示。表7-3 ListIterator迭代器的

27、特有方法方法声明功能描述void add(Object o)将指定的元素插入列表(可选操作)boolean hasPrevious()如果以逆向遍历列表,列表迭代器有多个元素,则返回 trueObject previous()返回列表中的前一个元素void remove()从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)2、在本案例中,使用hasPrevious()方法判断是否存在上一个元素,如果存在,则通过previous()方法将元素取出,否则,则表示到达了集合的末尾,没有要遍历的元素。3、在遍历过程中,如果想增加元素同样不能调用集合对象的add()方法,此时

28、需要使用ListIterator提供的add()方法,否则会出现并发修改异常ConcurrentModificationException。需要注意的是,ListIterator迭代器只能用于List集合。案例7-8 用Enumeration迭代Vector集合一、案例描述 1、 考核知识点编号:00107009名称:Enumeration接口2、 练习目标 掌握如何使用Enumeration迭代器的特有方法遍历Vector集合中的元素3、 需求分析在JDK1.2以前还没有Iterator接口的时候,遍历集合需要使用Enumeration迭代器接口。由于很多程序中依然在使用Enumeratio

29、n,因此了解该接口的用法是很有必要的。Vevtor集合是List接口的一个实现类。为了让初学者能熟悉Enumeration迭代器的用法,本案例将演示如何用Enumeration迭代器遍历Vector集合。4、 设计思路(实现原理)1) 编写一个类Example08,在该类中定义一个Vector集合v2) 向集合v中添加四个元素3) 用Enumeration迭代器遍历集合v,输出集合中的每一个元素二、案例实现import java.util.*;public class Example08 public static void main(String args) Vector v = new V

30、ector(); /创建Vector集合v.addElement(秦始皇);v.addElement(成吉思汗);v.addElement(朱元璋);v.addElement(李世民);Enumeration e = v.elements();while (e.hasMoreElements() /Enumeration迭代器遍历Vector集合String name = (String) e.nextElement();运行结果如图7-10所示。图7-10 运行结果三、案例总结1、JDK中提供了一个Vevtor集合,该集合是List接口的一个实现类,用法与ArrayList完全相同,区别在于

31、Vector集合是线程安全的,而ArrayList集合是线程不安全的。在Vector类中提供了一个elements()方法用于返回Enumeration对象,通过Enumeration对象就可以遍历该集合中的元素。2、在本案例中,使用Enumeration迭代器时,使用一个while循环对集合中的元素进行迭代,其过程与Iterator迭代的过程类似,通过hasMoreElements()方法循环判断是否存在下一个元素,如果存在,则通过nextElement()方法逐一取出每个元素。案例7-9 HashSet集合的存储一、案例描述 1、 考核知识点编号:00107010名称:HashSet集合2

32、、 练习目标 了解HashSet集合的存储特点 掌握HashSet集合的用法3、 需求分析HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。为了让初学者熟悉HashSet集合的用法,本案例将针对HashSet集合中元素不可重复的特点,对HashSet集合的存储和遍历过程进行演示。4、 设计思路(实现原理)1) 编写一个类Example09,在该类中定义一个HashSet集合hs2) 向集合hs中添加6个元素,其中有一些重复的元素3) 用size()方法获取添加完元素后集合中元素的个数4) 用Iterator迭代器遍历集合的每一个元素5) 观察在输出结果中,

33、是否存在重复的元素二、案例实现import java.util.*;public class Example09 public static void main(String args) / 创建HashSet集合HashSet hs = new HashSet();/向HashSet集合中添加元素,其中包括重复元素hs.add(abc2);hs.add(abc2);hs.add(abc1);hs.add(abc4);hs.add(abc4);hs.add(abc3);/ 输出集合中元素的个数添加后集合中元素个数:+hs.size();/ 输出集合中每一个元素Iterator it = hs.

34、iterator();添加后集合中包含以下元素:);while (it.hasNext() ;运行结果如图7-11所示。图7-11 运行结果三、案例总结1、HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后再调用对象的equals()方法来确保该位置没有重复元素。2、在本案例中,首先通过add()方法向HashSet集合依次添加了六个字符串,然后通过Iterator迭代器遍历所有的元素并输出打印。从打印结果可以看出取出元素的顺序与添加元素的顺序并不一

35、致,并且重复存入的字符串对象abc2和abc4被去除了,只添加了一次。案例7-10 将Object类存入HashSet一、案例描述 1、 考核知识点编号:00107010名称:HashSet集合2、 练习目标 掌握如何将对象存入HashSet集合并且去除重复对象3、 需求分析HashSet集合之所以能确保不出现重复的元素,是因为它在添加对象时,会先调用该对象的hashCode()方法来确定元素的存储位置,再调用对象的equals()方法来确保该位置没有重复元素。为了将Object类存入HashSet集合,本案例将针对如何重写Object类中的hashCode()和equals()方法去除重复的

36、Object对象进行演示。4、 设计思路(实现原理)1) 设计一个Person类,在该类中定义两个变量name和age2) 在Person类中重写hashCode()和equals()方法3) 编写类Example10,在该类中定义一个HashSet集合4) 将Person对象存入HashSet集合中,其中含有重复的Person对象5) 遍历HashSet集合中的元素,观察结果是否含有重复的对象二、案例实现设计Person类,其代码如下:class Person private String name;private int age;public Person(String name, int

37、 age) this.name = name;this.age = age;/ 重写hashCode方法,返回name属性的哈希值public int hashCode() return name.hashCode() + age * 2;/ 重写equals方法public boolean equals(Object obj) if (this = obj)return true;if (obj instanceof Person) Person p = (Person) obj;return & this.age = p.age;return false;/ 重写toString()方法p

38、ublic String toString() return Person + name + age;编写类Example10,其代码如下:import java.util.*;public class Example10 public static void main(String args) / 创建HashSet对象HashSet hs = new HashSet();/ 将Person对象存入集合hs.add(new Person(lisa, 21);hs.add(new Person(lisi, 32);hs.add(new Person(lisi, 32);hs.add(new P

39、erson(leilei, 31);hs.add(new Person(lusi, 25);hs.add(new Person(lusi, 25);/ 遍历集合中的元素Iterator it = hs.iterator();while (it.hasNext() Person p = (Person) it.next();运行结果如图7-12所示。图7-12 运行结果三、案例总结在本案例中,当HashSet集合的存入元素时,首先调用当前存入对象的hashCode()方法获得name属性的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存

40、在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃。整个存储的流程如图7-13所示。图7-13 HashSet对象存储过程案例7-11 TreeSet集合的存储一、案例描述 1、 考核知识点编号:00107012名称:TreeSet集合2、 练习目标 了解TreeSet集合的存储特点 掌握TreeSet集合的存储和迭代操作3、 需求分析TreeSet是Set接口的另一个实现类,它内部采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,并且可以

41、对元素进行排序。为了让初学者能熟悉TreeSet集合的使用,本案例通过向TreeSet集合添加元素并遍历集合元素来演示。4、 设计思路(实现原理)1) 编写一个类Example11,定义一个TreeSet集合2) 向TreeSet集合中添加一系列元素,其中有重复元素3) 遍历输出TreeSet集合中所有的元素二、案例实现import java.util.*;public class Example11 public static void main(String args) TreeSet ts = new TreeSet();/创建TreeSet集合ts.add(abc3);/向集合中添加一

42、系列元素,其中包括重复元素ts.add(abc2);ts.add(abc4);ts.add(aabbcc);ts.add(aabbcc);ts.add(abc1);Iterator it = ts.iterator();while (it.hasNext() /使用Iterator迭代器遍历TreeSet集合元素;运行结果如图7-14所示。图7-14 运行结果三、案例总结TreeSet内部采用平衡二叉树来存储元素,所谓二叉树就是说每个节点最多有两个子节点的有序树,每个节点及其子节点组成的树称为子树,通常左侧的子节点称为“左子树”,右侧的节点称为“右子树”,其中左子树上的元素应小于它的根结点,而

43、右子树上的元素应大于它的根结点。二叉树中元素的存储结构如图7-15所示。图7-15 二叉树的存储结构案例7-12 自定义比较器一、案例描述 1、 考核知识点编号:00107013名称:Comparator比较器2、 练习目标 掌握如何通过自定义比较器的方式对TreeSet集合中的元素排序3、 需求分析如果定义的类没有实现Comparable接口或者对于实现了Comparable接口的类而不想按照定义的compareTo()方法进行排序,这时,可以通过自定义比较器的方式对TreeSet集合中的元素排序。为了让初学者能掌握自定义比较器的编写,本案例将通过自定义比较器对TreeSet集合中的元素排序。4、 设计思路(实现原理)1) 设计类Person,该类中有变量name和age,并实现它们的get()和set()方法。2) 设计类MyComparator自定义比较器,该类实现了Comparator接口3) 在类MyComparator中实现比较方法,以Person对象中

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号