收藏 分销(赏)

第7章 集合类_补充案例.doc

上传人:xrp****65 文档编号:7457024 上传时间:2025-01-05 格式:DOC 页数:32 大小:500.50KB 下载积分:10 金币
下载 相关 举报
第7章 集合类_补充案例.doc_第1页
第1页 / 共32页
第7章 集合类_补充案例.doc_第2页
第2页 / 共32页


点击查看更多>>
资源描述
博学谷——让IT教学更简单,让IT学习更有效 第七章 集合 案例7-1 Collection接口对集合的操作 一、案例描述 1、 考核知识点 编号:00107002 名称:Collection接口 2、 练习目标 Ø 掌握Collection接口中方法的使用 3、 需求分析 Collection是所有单列集合的父接口,在Collection中定义了单列集合(List和Set)通用的一些方法。为了让初学者熟悉Collection接口中的常用方法,本案例将演示Collection接口中的方法对集合进行操作来学习方法的使用。 4、 设计思路(实现原理) 1) 编写一个类Example01 2) 在类中定义两个Collection集合,并向其中一个集合中添加数据 3) 用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(); System.out.println("col1集合是否为空:"+a); System.out.println("col2集合是否为空:"+b); // 将集合col1中的元素添加到 col2中 col2.addAll(col1); System.out.println("col1集合中的元素添加到 col2后,col2集合:"+col2); // 获取两个集合的交集 boolean c = col1.retainAll(col2); System.out.println("col1和col2集合是否有交集:"+c); // 清除集合col2中的元素 col2.clear(); System.out.println("清除集合col2中的元素后,col2集合::"+col2); // 获取集合中元素的个数 int size = col1.size(); System.out.println("col1集合中元素的个数:"+size); } } 运行结果如图7-1所示。 图7-1 运行结果 三、案例总结 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) 删除指定集合中的所有元素 boolean isEmpty() 判断该集合是否为空 boolean contains(Object o) 判断该集合中是否包含某个元素 boolean containsAll(Collection c) 判断该集合中是否包含指定集合中的所有元素 Iterator iterator() 返回在该集合的元素上进行迭代的迭代器(Iterator),用于遍历该集合所有元素 int size() 获取该集合元素个数 2、在编译案例时,会得到如图7-2所示的警告,意思是说在使用ArrayList集合时并没有显示的指定集合中存储什么类型的元素,会产生安全隐患,这涉及到泛型安全机制的问题。此警告对程序输出结果没有影响。 图7-2 编译警告 3、在编写程序时,不要忘记使用import java.util.*;语句导包,否则程序将会编译失败,显示类找不到。 案例7-2 List接口的特有方法 一、案例描述 1、 考核知识点 编号:00107003 名称:List接口 2、 练习目标 Ø 掌握List接口的常用方法的使用 3、 需求分析 List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法。为了熟悉List接口中特有方法的使用,本案例将演示使用List接口中的方法对List集合进行添加、修改等操作。 4、 设计思路(实现原理) 1) 编写一个类Example02 2) 在类中定义两个list集合,并向其中一个集合中添加数据。 3) 用 subList(int fromIndex, int toIndex)方法获取集合的一部分 4) 用set(int index, E element)方法修改一个元素 5) 用add(int index, E element)方法增加一个元素 二、案例实现 import java.util.*; public class Example02{ public static void main(String[] args) { List list = new ArrayList(); list.add("abc1"); //add()方法添加元素 list.add("abc2"); list.add("abc3"); list.add("abc4"); System.out.println(list); List newList = list.subList(0, 2);//subList()方法获取集合的前两个元素 System.out.println(newList); Object o = list.set(0, "haha");//set()方法修改指定位置元素值为haha System.out.println(list); System.out.println(o); list.add(0, "QQ");//add()方法在集合指定位置增加一个元素QQ System.out.println(list); } } 运行结果如图7-3所示。 图7-3 运行结果 三、案例总结 1、在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。 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处的元素 Object remove(int index) 删除index索引处的元素 Object set(int index, Object element) 将索引index处元素替换成element对象,并将替换后的元素返回 int indexOf(Object o) 返回对象o在List集合中出现的位置索引 int lastIndexOf(Object o) 返回对象o在List集合中最后一次出现的位置索引 List subList(int fromIndex, int toIndex) 返回从索引fromIndex(包括 )到 toIndex(不包括)处所有元素集合组成的子集合 案例7-3 ArrayList集合的存取 一、案例描述 1、 考核知识点 编号:00107004 名称:ArrayList集合 2、 练习目标 Ø 了解ArrayList集合的特点 Ø 掌握对ArrayList集合中元素的存取操作 3、 需求分析 ArrayList是List接口的一个实现类,ArrayList集合中大部分方法都是从父类Collection和List继承过来的。为了熟悉ArrayList集合的使用,本案例将演示ArrayList集合的定义、存储元素和取出元素。 4、 设计思路(实现原理) 1) 编写一个类Example03 2) 在类中定义一个ArrayList集合 3) 用add()方法向集合中添加元素 4) 用get()方法获取集合中的指定元素,由于ArrayList集合的索引的取值范围是从0开始的,最后一个索引是size-1。所以,要获取集合中的第2个元素应该是get(1)。 二、案例实现 import java.util.*; public class Example03{ public static void main(String[] args) { ArrayList array = new ArrayList(); array.add("lisi"); array.add("wangwu"); array.add("jordan"); array.add("jackson"); array.add("white"); System.out.println(array); System.out.println("第2个元素是:" + array.get(1)); } } 运行结果如图7-4所示。 图7-4 运行结果 三、案例总结 1、在ArrayList内部封装了一个长度可变的数组对象,当存入的元素超过数组长度时,ArrayList会在 内存中分配一个更大的数组来存储这些元素,因此可以将ArrayList集合看作一个长度可变的数组。 2、索引位置为1的元素是集合中的第二个元素,这就说明集合和数组一样,索引的取值范围是从0开始的,最后一个索引是size-1,在访问元素时一定要注意索引不可超出此范围,否则会抛出角标越界异常IndexOutOfBoundsException。 3、由于ArrayList集合的底层是使用一个数组来保存元素,在增加或删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作。但这种数组的结构允许程序通过索引的方式来访问元素,因此使用ArrayList集合查找元素很便捷。 案例7-4 LinkedList集合的特殊方法 一、案例描述 1、 考核知识点 编号:00107005 名称:LinkedList集合 2、 练习目标 Ø 了解LinkedList集合的特点 Ø 掌握LinkedList集合的特殊方法的使用 3、 需求分析 ArrayList集合在查询元素时速度很快,但在增删元素时效率较低,为了克服这种局限性,可以使用List接口的另一个实现类LinkedList。LinkedList集合除了对于元素的增删操作具有很高的效率,还专门针对元素的增删操作定义了一些特有的方法。为了熟悉这些特殊的方法,本案例将演示如何使用LinkedList中的特殊方法对集合进行增删操作。 4、 设计思路(实现原理) 1) 编写一个类Example04,在该类中定义一个LinkedList集合 2) 分别使用addFirst()和addLast()方法向集合中添加元素 3) 使用peekFirst()方法获取集合中的第一个元素 4) 使用pollFirst()方法获取并移除集合中的第一个元素 5) 使用pollLast()方法获取并移除集合中的最后一个元素 6) 此时,集合中应该没有元素了,用peekLast()方法获取集合中的最后一个元素,由于集合为空,应该返回NULL 二、案例实现 import java.util.*; public class Example04 { public static void main(String[] args) { LinkedList link = new LinkedList(); link.addFirst("abc1"); //将指定元素插入此集合的开头 link.addLast("haha"); //将指定元素添加到此集合的结尾 System.out.println(link.peekFirst());//获取但不移除此集合的第一个元素 System.out.println(link.pollFirst());//获取但不移除此集合的最后一个元素 System.out.println(link); System.out.println(link.pollLast());//获取并移除此集合的第一个元素 System.out.println(link); System.out.println(link.peekLast());//获取并移除此集合的最后一个元素 } } 运行结果如图7-5所示。 图7-5 运行结果 三、案例总结 1、LinkedList集合内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素,从而可以将所有的元素彼此连接起来。当插入一个新元素时,只需要修改元素之间的这种引用关系即可,删除一个节点也是如此。正因为这样的存储结构,所以LinkedList集合对于元素的增删操作具有很高的效率。 2、在本案例中,所用的方法及其功能具体如下: 1) peekFirst()方法用于获取LinkedList集合中的第一个元素,如果此列表为空则返回NULL 2) peekLast()方法用于获取LinkedList集合中的最后一个元素,如果此列表为空则返回NULL 3) pollFirst()方法用于获取并移除LinkedList集合中的第一个元素,如果此列表为空则返回NULL 4) pollLast()方法用于获取并移除LinkedList集合中的最后一个元素,如果此列表为空则返回NULL 5) addFirst()方法用于添加LinkedList集合中的第一个元素 6) addLast()方法用于添加LinkedList集合中的最后一个元素 案例7-5 Iterator遍历集合元素 一、案例描述 1、 考核知识点 编号:00107006 名称:Iterator接口 2、 练习目标 Ø 掌握Iterator迭代器的使用 3、 需求分析 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口Iterator。为了使初学者熟悉Iterator迭代器的使用,本案例将演示如何使用Iterator迭代器遍历集合中的元素。 4、 设计思路(实现原理) 1) 编写一个类Example05 2) 在类中定义一个List集合,并向集合中添加数据 3) 通过调用List集合的iterator()方法获得迭代器对象 4) 在while循环条件中使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素 二、案例实现 定义Example05类,其代码如下: import java.util.*; public class Example05 { public 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(); //取出元素 System.out.println(obj); } } } 运行结果如图7-6所示。 图7-6 运行结果 三、案例总结 1、需要注意的是,在通过next()方法获取元素时,必须保证要获取的元素存在,否则,会抛出NoSuchElementException异常。 2、Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,图7-7演示了Iterator对象迭代元素的过程。 图7-7 遍历元素过程图 案例7-6 foreach循环:简化遍历 一、案例描述 1、 考核知识点 编号:00107007 名称:foreach循环 2、 练习目标 Ø 掌握使用foreach循环遍历集合和数组 3、 需求分析 虽然Iterator可以用来遍历集合中的元素,但写法上比较繁琐,为了简化书写,从JDK5.0开始,提供了foreach循环。foreach循环用于遍历数组或集合中的元素。为了让初学者能熟悉foreach循环的使用,本案例将演示如何用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(); list.add("sv"); list.add("lv"); list.add("mv"); list.add("tv"); System.out.println("遍历集合中的元素:"); for (Object obj : list) { //foreach循环遍历集合中的元素 System.out.println(obj); } // 定义数组 int[] arr = { 3, 2, 6 }; System.out.println("遍历数组中的元素:"); for (int x : arr) { //foreach循环遍历数组中的元素 System.out.println(x); } } } 运行结果如图7-8所示。 图7-8 运行结果 三、案例总结 1、通过案例可以看出,foreach循环在遍历集合时语法非常简洁,没有循环条件,也没有迭代语句,所有这些工作都交给虚拟机去执行了。foreach循环的次数是由容器中元素的个数决定的,每次循环时,foreach中都通过变量将当前循环的元素记住,从而将集合中的元素分别打印出来。 2、使用foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改。 案例7-7 ListIterator迭代器的特有方法 一、案例描述 1、 考核知识点 编号:00107008 名称:ListIterator接口 2、 练习目标 Ø 掌握ListIterator接口中特有方法的使用 3、 需求分析 ListIterator迭代器是Iterator的子类,该类在父类的基础上增加了一些特有方法。为了让初学者能熟悉ListIterator接口中特有方法的使用,本案例将演示如何用ListIterator接口中的方法向集合中插入元素和逆向遍历集合。 4、 设计思路(实现原理) 1) 编写一个类Example07 2) 在该类中定义一个List集合,向集合中添加四个元素 3) 用ListIterator接口的add()方法向集合中插入一个元素并遍历集合list 4) 用ListIterator接口的boolean hasPrevious()方法逆向遍历集合 二、案例实现 import java.util.*; public class Example07 { public static void main(String[] args) { List list = new ArrayList(); list.add("abc1"); list.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"); } System.out.println(o); } // 逆向遍历集合 System.out.println("以下是逆向遍历"); while (lit.hasPrevious()) { System.out.println(lit.previous()); } } } 运行结果如图7-9所示。 图7-9 运行结果 三、案例总结 1、ListIterator迭代器的特有方法,如表7-3所示。 表7-3 ListIterator迭代器的特有方法 方法声明 功能描述 void add(Object o) 将指定的元素插入列表(可选操作) boolean hasPrevious() 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true Object previous() 返回列表中的前一个元素 void remove() 从列表中移除由 next 或 previous 返回的最后一个元素(可选操作) 2、在本案例中,使用hasPrevious()方法判断是否存在上一个元素,如果存在,则通过previous()方法将元素取出,否则,则表示到达了集合的末尾,没有要遍历的元素。 3、在遍历过程中,如果想增加元素同样不能调用集合对象的add()方法,此时需要使用ListIterator提供的add()方法,否则会出现并发修改异常ConcurrentModificationException。需要注意的是,ListIterator迭代器只能用于List集合。 案例7-8 用Enumeration迭代Vector集合 一、案例描述 1、 考核知识点 编号:00107009 名称:Enumeration接口 2、 练习目标 Ø 掌握如何使用Enumeration迭代器的特有方法遍历Vector集合中的元素 3、 需求分析 在JDK1.2以前还没有Iterator接口的时候,遍历集合需要使用Enumeration迭代器接口。由于很多程序中依然在使用Enumeration,因此了解该接口的用法是很有必要的。Vevtor集合是List接口的一个实现类。为了让初学者能熟悉Enumeration迭代器的用法,本案例将演示如何用Enumeration迭代器遍历Vector集合。 4、 设计思路(实现原理) 1) 编写一个类Example08,在该类中定义一个Vector集合v 2) 向集合v中添加四个元素 3) 用Enumeration迭代器遍历集合v,输出集合中的每一个元素 二、案例实现 import java.util.*; public class Example08 { public static void main(String[] args) { Vector v = new Vector(); //创建Vector集合 v.addElement("秦始皇"); v.addElement("成吉思汗"); v.addElement("朱元璋"); v.addElement("李世民"); Enumeration e = v.elements(); while (e.hasMoreElements()) { //Enumeration迭代器遍历Vector集合 String name = (String) e.nextElement(); System.out.println(name); } } } 运行结果如图7-10所示。 图7-10 运行结果 三、案例总结 1、JDK中提供了一个Vevtor集合,该集合是List接口的一个实现类,用法与ArrayList完全相同,区别在于Vector集合是线程安全的,而ArrayList集合是线程不安全的。在Vector类中提供了一个elements()方法用于返回Enumeration对象,通过Enumeration对象就可以遍历该集合中的元素。 2、在本案例中,使用Enumeration迭代器时,使用一个while循环对集合中的元素进行迭代,其过程与Iterator迭代的过程类似,通过hasMoreElements()方法循环判断是否存在下一个元素,如果存在,则通过nextElement()方法逐一取出每个元素。 案例7-9 HashSet集合的存储 一、案例描述 1、 考核知识点 编号:00107010 名称:HashSet集合 2、 练习目标 Ø 了解HashSet集合的存储特点 Ø 掌握HashSet集合的用法 3、 需求分析 HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。为了让初学者熟悉HashSet集合的用法,本案例将针对HashSet集合中元素不可重复的特点,对HashSet集合的存储和遍历过程进行演示。 4、 设计思路(实现原理) 1) 编写一个类Example09,在该类中定义一个HashSet集合hs 2) 向集合hs中添加6个元素,其中有一些重复的元素 3) 用size()方法获取添加完元素后集合中元素的个数 4) 用Iterator迭代器遍历集合的每一个元素 5) 观察在输出结果中,是否存在重复的元素 二、案例实现 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"); // 输出集合中元素的个数 System.out.println("添加后集合中元素个数:"+hs.size()); // 输出集合中每一个元素 Iterator it = hs.iterator(); System.out.println("添加后集合中包含以下元素:"); while (it.hasNext()) { System.out.println(it.next()); } } } 运行结果如图7-11所示。 图7-11 运行结果 三、案例总结 1、HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来确定元素的存储位置,然后再调用对象的equals()方法来确保该位置没有重复元素。 2、在本案例中,首先通过add()方法向HashSet集合依次添加了六个字符串,然后通过Iterator迭代器遍历所有的元素并输出打印。从打印结果可以看出取出元素的顺序与添加元素的顺序并不一致,并且重复存入的字符串对象"abc2"和"abc4"被去除了,只添加了一次。 案例7-10 将Object类存入HashSet 一、案例描述 1、 考核知识点 编号:00107010 名称:HashSet集合 2、 练习目标 Ø 掌握如何将对象存入HashSet集合并且去除重复对象 3、 需求分析 HashSet集合之所以能确保不出现重复的元素,是因为它在添加对象时,会先调用该对象的hashCode()方法来确定元素的存储位置,再调用对象的equals()方法来确保该位置没有重复元素。为了将Object类存入HashSet集合,本案例将针对如何重写Object类中的hashCode()和equals()方法去除重复的Object对象进行演示。 4、 设计思路(实现原理) 1) 设计一个Person类,在该类中定义两个变量name和age 2) 在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 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.name.equals(p.name) && this.age == p.age; } return false; } // 重写toString()方法 public 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 Person("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(); System.out.println(p); } } } 运行结果如图7-12所示。 图7-12 运行结果 三、案例总结 在本案例中,当HashSet集合的存入元素时,首先调用当前存入对象的hashCode()方法获得name属性的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较,如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃。整个存储的流程如图7-13所示。 图7-13 HashSet对象存储过程 案例7-11 TreeSet集合的存储 一、案例描述 1、 考核知识点 编号:00107012 名称:TreeSet集合 2、 练习目标 Ø 了解TreeSet集合的存储特点 Ø 掌握TreeSet集合的存储和迭代操作 3、 需求分析 TreeSet是Set接口的另一个实现类,它内部采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,并且可以对元素进行排序。为了让初学者能熟悉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");
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服