Download presentation
Presentation is loading. Please wait.
Published byДарья Максимова Modified 5年之前
1
本章目标 掌握集合框架包含的内容 掌握ArrayList和LinkedList的使用 掌握HashMap的使用 掌握Iterator的使用
掌握泛型集合的使用
2
为什么使用集合框架 存储一个班学员信息,假定一个班容纳20名学员 如何存储每天的新闻信息?
学员1 学员20 一维数组 每天的新闻总数不确定,太少浪费空间,太多空间不足 如何存储每天的新闻信息? 新闻1 …… 新闻N 如何存储ACCP课程的代码与课程信息,能够通过代码方便地获得课程信息? 代码1 …… 代码N 一一对应 课程1 …… 课程N 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架
3
Java集合框架包含的内容2-1 接口 1 具体类 2 3 算法 Collection Map List Set ArrayList
LinkedList HashSet TreeSet HashMap TreeMap 具体类 2 提供了对集合进行排序、 遍历等多种算法实现 算法 Collections 3 Java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们位于java.util包中 我们不必再重新发明轮子,只需学会如何使用它们,就可处理实际应用中问题
4
Java集合框架包含的内容2-2 Collection 接口存储一组不唯一,无序的对象 List 接口存储一组不唯一,有序(插入顺序)的对象
Set Collection 接口存储一组不唯一,无序的对象 List 接口存储一组不唯一,有序(插入顺序)的对象 Set 接口存储一组唯一,无序的对象 Map接口存储一组键值对象,提供key到value的映射 Map 4
5
List接口的实现类 ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
LinkedList ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高 LinkedList采用链表存储方式。插入、删除元素时效率比较高
6
ArrayList集合类5-1 存储多条狗狗信息,获取狗狗总数,逐条打印出各条狗狗信息 通过List接口的实现类ArrayList实现该需求
元素个数不确定 要求获得元素的实际个数 按照存储顺序获取并打印元素信息
7
ArrayList集合类5-2 public class Test1 {
public static void main(String[] args) { Dog ououDog = new Dog("欧欧", "雪娜瑞"); Dog yayaDog = new Dog("亚亚", "拉布拉多"); Dog meimeiDog = new Dog("美美", "雪娜瑞"); 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); System.out.println(dog.getName() + "\t"+ dog.getStrain()); } 创建ArrayList对象并把四个狗狗对象放入其中 输出狗狗的数量 获取第i个元素 演示示例:使用ArrayList集合类
8
ArrayList集合类5-3 扩充以下几部分功能 List接口提供相应方法remove()、contains(),直接使用即可
删除指定位置的狗狗,如第一个狗狗 删除指定的狗狗,如删除feifeiDog对象 判断集合中是否包含指定狗狗 List接口提供相应方法remove()、contains(),直接使用即可
9
ArrayList集合类5-4 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删除之后还有" + dogs.size() + "条狗狗。"); if(dogs.contains(meimeiDog)) System.out.println("\n集合中包含美美的信息"); else System.out.println("\n集合中不包含美美的信息"); } 删除第一个狗狗和feifeiDog 判断是否包含指定狗狗 演示示例:使用ArrayList集合类
10
ArrayList集合类5-5 List接口常用方法 方法名 说 明 boolean add(Object o)
说 明 boolean add(Object o) 在列表的末尾顺序添加元素,起始索引位置从0开始 void add(int index,Object o) 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 int size() 返回列表中的元素个数 Object get(int index) 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 boolean contains(Object o) 判断列表中是否存在指定元素 boolean remove(Object o) 从列表中删除元素 Object remove(int index) 从列表中删除指定位置元素,起始索引位置从0开始
11
练习——添加多个企鹅信息到List中 需求说明: 把多个企鹅的信息添加到集合中 查看企鹅的数量 遍历所有企鹅的信息 删除集合中部分企鹅的元素
判断集合中是否包含指定企鹅 完成时间:20分钟
12
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
13
LinkedList集合类3-1 在集合任何位置(头部、中间、尾部)添加、获取、删除狗狗对象
14
演示示例:使用LinkedList集合类
public 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("第一条狗狗昵称是"+dogFirst.getName() ); Dog dogLast= (Dog)dogs.getLast(); System.out.println("最后一条狗狗昵称是"+dogLast.getName()); dogs.removeFirst(); dogs.removeLast(); … } 创建LinkedList集合对象并把多个狗狗对象放入其中 获取第一条狗狗信息 获取最后一条狗狗信息 删除第一个狗狗和最后一个狗狗 演示示例:使用LinkedList集合类
15
LinkedList集合类3-3 LinkedList的特殊方法 方法名 说 明 void addFirst(Object o)
说 明 void addFirst(Object o) 在列表的首部添加元素 void addLast(Object o) 在列表的末尾添加元素 Object getFirst() 返回列表中的第一个元素 Object getLast() 返回列表中的最后一个元素 Object removeFirst() 删除并返回列表中的第一个元素 Object removeLast() 删除并返回列表中的最后一个元素
16
小结 集合框架有何好处? Java集合框架中包含哪些接口和哪些类? ArrayList和LinkedList有何异同?
17
Map接口3-1 建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作,应该如何实现数据的存储和操作呢?
最常用的实现类是HashMap
18
Map接口3-2 public class Test4 { public static void main(String[] args) {
Map countries = new HashMap(); countries.put("CN", "中华人民共和国"); 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的key吗?" + countries.containsKey("FR")); System.out.println( countries.keySet() ) ; System.out.println( countries.values() ); System.out.println( countries ); } 使用HashMap存储多组键值对 获取指定元素的值 获取Map元素个数 删除指定元素,判断是否包含指定元素 显示键集、值集和键值对集 演示示例:使用HashMap集合类
19
Map接口3-3 Map接口常用方法 方法名 说 明 Object put(Object key, Object val)
说 明 Object put(Object key, Object val) 以“键-值对”的方式进行存储 Object get (Object key) 根据键返回相关联的值,如果不存在指定的键,返回null Object remove (Object key) 删除由指定的键映射的“键-值对” int size() 返回元素个数 Set keySet () 返回键的集合 Collection values () 返回值的集合 boolean containsKey (Object key) 如果存在由指定的键映射的“键-值对”,返回true
20
集合类对比 Vector和ArrayList的异同 Hashtable和HashMap的异同 实现原理相同,功能相同,很多情况下可以互用
两者的主要区别如下 Vector线程安全,ArrayList重速度轻安全,线程非安全 长度需增长时,Vector默认增长一倍,ArrayList增长50% Hashtable和HashMap的异同 实现原理相同,功能相同,在很多情况下可以互用 Hashtable继承Dictionary类,HashMap实现Map接口 Hashtable线程安全,HashMap线程非安全 Hashtable不允许null值,HashMap允许null值 开发过程中,最好使用ArrayList和HashMap
21
练习——根据宠物昵称查找宠物 需求说明: 根据宠物昵称查找对应宠物,如果找到,显示宠物信息,否则给出错误提示 完成时间:15分钟
22
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
23
迭代器Iterator2-1 如何遍历List集合呢? 方法1:通过for循环和get()方法配合实现遍历
Collection 接口的iterate()方法返回一个Iterator,然后通过Iterator接口的两个方法可实现遍历 boolean hasNext(): 判断是否存在另一个可访问的元素 Object next(): 返回要访问的下一个元素
24
迭代器Iterator2-2 public class Test5 {
public static void main(String[] args) { // 1、创建多个狗狗对象 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.getName()+"\t"+dog.getStrain()); } 通过迭代器依次输出所有狗狗的信息 演示示例:使用Iterator遍历集合
25
练习——迭代List中企鹅信息 需求说明:
使用ArrayList和LinkedList存储多个企鹅信息,然后统一使用Iterator进行遍历 完成时间:15分钟
26
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
27
泛型集合3-1 把任何类型对象通过add(Object obj) 放入List中,认为只是Object类型
通过get(int index) 取出List中元素时必须进行强制类型转换,繁琐而且容易出现异常 使用Map的put(Object key, Object value)和get (Object key)存取对象时存在同样问题 使用Iterator的next()方法获取元素时存在同样问题 JDK5.0中通过引入泛型有效的解决了这个问题 JDK5.0使用泛型改写了集合框架中的所有接口和类
28
泛型集合3-2 public class Test6 { public static void main(String[] args) {
// 1、创建多个狗狗对象 Dog dog1 = new Dog("欧欧", "雪娜瑞"); … // 2、创建ArrayList集合对象并把多个狗狗对象放入其中 List <Dog> dogs = new ArrayList<Dog>(); dogs.add(dog1); //dogs.add("hello"); // 3、 显示第三个元素的信息 Dog dog = dogs.get(2); System.out.println("第三个狗狗的信息如下:"); System.out.println(dog.getName() + "\t" + dog.getStrain()); //4、使用Iterator遍历dogs对象 System.out.println("\n所有狗狗的信息如下:"); Iterator <Dog> it = dogs.iterator(); while (it.hasNext()) { dog = it.next(); } 标记元素类型 标记元素类型 类型不符,出现编译错误 无需类型强制转换 (Dog) Dogs.get(2); 标记元素类型 无需类型强制转换 (Dog) it.next(); 演示示例:使用泛型集合
29
泛型集合3-3 public class Test7 { public static void main(String[] args) {
//1、使用HashMap存储多组国家英文简称和中文全称的键值对 Map <String,String> countries=new HashMap<String,String>(); countries.put("CN", "中华人民共和国"); countries.put("RU", "俄罗斯联邦"); countries.put("FR", "法兰西共和国"); //2、显示"CN"对应国家的中文全称 String country= countries.get("CN"); System.out.println("CN对应的国家是:"+country); } 标记键-值类型 标记键-值类型 无需类型强制转换 (String) countries.get("CN"); 演示示例:使用泛型集合
30
总结 Collection 、List 、Set 、Map接口的联系和区别有哪些? ArrayList和LinkedList有什么异同之处?
有哪些遍历集合的方法? 为什么要引入泛型集合?
Similar presentations