本章目标 掌握集合框架包含的内容 掌握ArrayList和LinkedList的使用 掌握HashMap的使用 掌握Iterator的使用 掌握泛型集合的使用
为什么使用集合框架 存储一个班学员信息,假定一个班容纳20名学员 如何存储每天的新闻信息? 学员1 学员20 一维数组 每天的新闻总数不确定,太少浪费空间,太多空间不足 如何存储每天的新闻信息? 新闻1 …… 新闻N 如何存储ACCP课程的代码与课程信息,能够通过代码方便地获得课程信息? 代码1 …… 代码N 一一对应 课程1 …… 课程N 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使用Java集合框架
Java集合框架包含的内容2-1 接口 1 具体类 2 3 算法 Collection Map List Set ArrayList LinkedList HashSet TreeSet HashMap TreeMap 具体类 2 提供了对集合进行排序、 遍历等多种算法实现 算法 Collections 3 Java集合框架为我们提供了一套性能优良、使用方便的接口和类,它们位于java.util包中 我们不必再重新发明轮子,只需学会如何使用它们,就可处理实际应用中问题
Java集合框架包含的内容2-2 Collection 接口存储一组不唯一,无序的对象 List 接口存储一组不唯一,有序(插入顺序)的对象 Set Collection 接口存储一组不唯一,无序的对象 List 接口存储一组不唯一,有序(插入顺序)的对象 Set 接口存储一组唯一,无序的对象 Map接口存储一组键值对象,提供key到value的映射 Map 4
List接口的实现类 ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高 LinkedList ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高 LinkedList采用链表存储方式。插入、删除元素时效率比较高
ArrayList集合类5-1 存储多条狗狗信息,获取狗狗总数,逐条打印出各条狗狗信息 通过List接口的实现类ArrayList实现该需求 元素个数不确定 要求获得元素的实际个数 按照存储顺序获取并打印元素信息
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集合类
ArrayList集合类5-3 扩充以下几部分功能 List接口提供相应方法remove()、contains(),直接使用即可 删除指定位置的狗狗,如第一个狗狗 删除指定的狗狗,如删除feifeiDog对象 判断集合中是否包含指定狗狗 List接口提供相应方法remove()、contains(),直接使用即可
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集合类
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开始
练习——添加多个企鹅信息到List中 需求说明: 把多个企鹅的信息添加到集合中 查看企鹅的数量 遍历所有企鹅的信息 删除集合中部分企鹅的元素 判断集合中是否包含指定企鹅 完成时间:20分钟
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
LinkedList集合类3-1 在集合任何位置(头部、中间、尾部)添加、获取、删除狗狗对象
演示示例:使用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集合类
LinkedList集合类3-3 LinkedList的特殊方法 方法名 说 明 void addFirst(Object o) 说 明 void addFirst(Object o) 在列表的首部添加元素 void addLast(Object o) 在列表的末尾添加元素 Object getFirst() 返回列表中的第一个元素 Object getLast() 返回列表中的最后一个元素 Object removeFirst() 删除并返回列表中的第一个元素 Object removeLast() 删除并返回列表中的最后一个元素
小结 集合框架有何好处? Java集合框架中包含哪些接口和哪些类? ArrayList和LinkedList有何异同?
Map接口3-1 建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作,应该如何实现数据的存储和操作呢? 最常用的实现类是HashMap
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集合类
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
集合类对比 Vector和ArrayList的异同 Hashtable和HashMap的异同 实现原理相同,功能相同,很多情况下可以互用 两者的主要区别如下 Vector线程安全,ArrayList重速度轻安全,线程非安全 长度需增长时,Vector默认增长一倍,ArrayList增长50% Hashtable和HashMap的异同 实现原理相同,功能相同,在很多情况下可以互用 Hashtable继承Dictionary类,HashMap实现Map接口 Hashtable线程安全,HashMap线程非安全 Hashtable不允许null值,HashMap允许null值 开发过程中,最好使用ArrayList和HashMap
练习——根据宠物昵称查找宠物 需求说明: 根据宠物昵称查找对应宠物,如果找到,显示宠物信息,否则给出错误提示 完成时间:15分钟
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
迭代器Iterator2-1 如何遍历List集合呢? 方法1:通过for循环和get()方法配合实现遍历 Collection 接口的iterate()方法返回一个Iterator,然后通过Iterator接口的两个方法可实现遍历 boolean hasNext(): 判断是否存在另一个可访问的元素 Object next(): 返回要访问的下一个元素
迭代器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遍历集合
练习——迭代List中企鹅信息 需求说明: 使用ArrayList和LinkedList存储多个企鹅信息,然后统一使用Iterator进行遍历 完成时间:15分钟
共性问题集中讲解 共性问题集中讲解 常见调试问题及解决办法 代码规范问题
泛型集合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使用泛型改写了集合框架中的所有接口和类
泛型集合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(); 演示示例:使用泛型集合
泛型集合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"); 演示示例:使用泛型集合
总结 Collection 、List 、Set 、Map接口的联系和区别有哪些? ArrayList和LinkedList有什么异同之处? 有哪些遍历集合的方法? 为什么要引入泛型集合?