• 1. 用集合存储对象
  • 2. 为什么需要集合框架学员1学员20如何存储每天的新闻信息?如何存储XTGJ课程的代码与课程信息,能够通过代码方便地获得课程信息?如果写程序时并不知道程序运行时会需要多少对象,或者,需要更复杂的方式存储对象——那么,可以使用Java集合框架,来解决这类问题一维数组代码1……代码N课程1……课程N一一对应新闻1……新闻N每天的新闻总数不确定,显然无法再使用数组保存存储一个班的学员信息,假定一个班容纳20名学员
  • 3. 集合的体系结构
  • 4. 各种集合的特点List:必须保持元素特定的顺序 Set:不能有重复元素 Map:一组成对的“键值对”对象
  • 5. Collection接口中的方法 booleanadd(E o)          确保此 collection 包含指定的元素(可选操作)。 voidclear()          移除此 collection 中的所有元素(可选操作)。 booleancontains(Object o)          如果此 collection 包含指定的元素,则返回 true。 booleanisEmpty()          如果此 collection 不包含元素,则返回 true。 Iteratoriterator()          返回在此 collection 的元素上进行迭代的迭代器。 booleanremove(Object o)          从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 intsize()          返回此 collection 中的元素数。 Object[]toArray()          返回包含此 collection 中所有元素的数组。
  • 6. List接口List集合类型描述了一种按位置存储数据的对象,第一个元素位于位置0,第二个位于是,依此类推,最后一个元素位置位于n-1(size()-1)
  • 7. List常用方法 booleanadd(E o)          向列表的尾部追加指定的元素(可选操作)。 voidadd(int index, E element)          在列表的指定位置插入指定元素(可选操作)。           比较指定的对象与列表是否相等。 Eget(int index)          返回列表中指定位置的元素。 intindexOf(Object o)          返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1。 Iteratoriterator()          返回以正确顺序在列表的元素上进行迭代的迭代器。 intlastIndexOf(Object o)          返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回 -1。
  • 8. List常用方法 ListIteratorlistIterator()          返回列表中元素的列表迭代器(以正确的顺序)。 ListIteratorlistIterator(int index)          返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始。 Eremove(int index)          移除列表中指定位置的元素(可选操作)。 Eset(int index, E element)          用指定元素替换列表中指定位置的元素(可选操作)。 intsize()          返回列表中的元素数。
  • 9. List接口的实现List接口的实现类有:ArrayList和LinkedList 这两种数据结构提供相同的基于索引的方法 这两种数据类型运行时间和效率大不相同
  • 10. List接口和ArrayList类 5-1开发一套小型的新闻管理系统,要求如下: 可以存储各类新闻标题(包含ID、名称、创建者、创建时间) 可以获取新闻标题的总数 可以逐条打印每条新闻标题的名称存储方式如何选择?元素个数不确定 使用集合类 需要遍历元素 存储对象如何确定?类型:新闻标题 属性:ID、名称、创建者、创建时间
  • 11. List接口和ArrayList类 5-2第一步,确定存储方式 1、ArrayList类是List接口的一个具体实现类 2、ArrayList 对象实现了可变大小的数组 3、随机访问和遍历元素时,它提供更好的性能元素1元素2元素3元素4元素5元素6元素7元素8元素9元素100129345786元素1元素2元素3元素4元素5元素6元素7元素8元素9元素10元素11创建了一个新的数组,把原数组中元素复制进来 012934578610根据下标位置访问元素
  • 12. List接口和ArrayList类 5-3第二步:确定存储对象 1、创建类型:新闻标题 2、包含属性: ID、名称、创建者、创建时间public class FirstLevelTitle { private int id; //ID private String titleName; //名称 private String creater; //创建者 private Date createTime; //创建时间 public FirstLevelTitle(int id, String titleName, String creater,Date createTime) { this.id = id; this.titleName = titleName; this.creater = creater; this.createTime = createTime; } public String getTitleName() { return titleName; } public void setTitleName(String titleName) { this.titleName = titleName; } }
  • 13. List接口和ArrayList类 5-4第三步:具体实现 1、按照顺序依次添加各类新闻标题 2、获取新闻标题的总数 3、根据位置获取相应新闻标题 4、逐条打印每条新闻标题的名称public class FirstLevelTitleDB1 { public static void main(String[] args) { FirstLevelTitle car = new FirstLevelTitle(1, "汽车", "管理员", new Date()); FirstLevelTitle test = new FirstLevelTitle(2, "高考", "管理员", new Date()); List newsTitleList = new ArrayList(); newsTitleList.add(car); newsTitleList.add(test); System.out.println("新闻标题数目为:" + newsTitleList.size() + "条"); print(newsTitleList); } public static void print(List newsList) { for (int i = 0; i < newsList.size(); i++) { FirstLevelTitle title = (FirstLevelTitle) newsList.get(i); System.out.println(i + 1 + ":" + title.getTitleName()); } } }123顺序添加,位置从0开始新闻标题数目为:2条 1:汽车 2:高考控制台输出4从集合中取出后为Object类型,需要进行强制类型转换
  • 14. List接口和ArrayList类 5-5第三步:具体实现 1、在指定的位置添加新闻标题 2、判断是否已经存储了某条新闻标题 3、删除指定位置处的某一新闻标题public class FirstLevelTitleDB2 { public static void main(String[] args) { FirstLevelTitle car = new FirstLevelTitle(1, "汽车", "网站管理员", new Date()); FirstLevelTitle test = new FirstLevelTitle(2, "高考", "网站管理员", new Date()); FirstLevelTitle house = new FirstLevelTitle(3, "房产", "网站管理员", new Date()); List newsTitleList = new ArrayList(); newsTitleList.add(car); newsTitleList.add(test); newsTitleList.add(2,house); if(newsTitleList.contains(test)){ System.out.println("有高考的新闻"); }else{ System.out.println("没有高考的新闻"); } newsTitleList.remove(1); System.out.println("新闻标题数目为:" + newsTitleList.size() + "条"); } }123在指定的位置添加元素 有高考的新闻 新闻标题数目为:2条控制台输出
  • 15. 小结1创建一个类Cat 包含属性name,在构造方法中进行初始化 添加一个方法show(),用以打印name属性的值 创建一个类CatTest,添加main方法,实现 创建一个ArrayList,向其中添加几个Cat对象 遍历该集合,并且对每个Cat对象调用show()方法
  • 16. ArrayList集合特性(1)是一种在内存连续区域 中存储数据的通用数组,底层的存储是一个允许直接访问的数组 动态增长,以满足应用程序的需要
  • 17. ArrayList集合特性(2)一种能够在尾部动态增长以满足应用程序需求的通用数组。在列表尾部插入或删除非常有效,但是在ArrayList之内的这些操作并不十分有效。为什么在ArrayList之内操作插入删除数据不是很有效?
  • 18. List接口和LinkedList类 3-1升级这套小型的新闻管理系统,要求如下: 可以添加头条新闻标题 可以删除末条新闻标题存储方式如何选择?元素个数不确定使用集合类需要在列表的头或尾添加、删除元素
  • 19. List接口和LinkedList类 3-2第一步,确定存储方式 1、LinkedList类是List接口的一个具体实现类 2、LinkedList 类用于创建链表数据结构 3、插入或者删除元素时,它提供更好的性能
  • 20. List接口和LinkedList类 3-3第二步:具体实现 1、添加头条、以及最末条新闻标题 2、获取头条、以及最末条新闻标题 3、删除头条、以及最末条新闻标题public class FirstLevelTitleDB3 { public static void main(String[] args) { FirstLevelTitle car = new FirstLevelTitle(1, "汽车", "管理员", new Date()); FirstLevelTitle medical = new FirstLevelTitle(2, "医学", "管理员",new Date()); LinkedList newsTitleList = new LinkedList(); newsTitleList.addFirst(car); newsTitleList.addLast(medical); FirstLevelTitle first = (FirstLevelTitle) newsTitleList.getFirst(); System.out.println("头条的新闻标题为:" + first.getTitleName()); FirstLevelTitle last = (FirstLevelTitle) newsTitleList.getLast(); System.out.println("排在最后的新闻标题为:" + last.getTitleName()); newsTitleList.removeFirst(); newsTitleList.removeLast(); } }123
  • 21. 小结2创建一个类Stack,代表堆栈(其特点为:后进先出),添加方法add(Object obj)、以及get(),添加main方法进行验证,要求: 使用LinkedList实现堆栈 在向LinkedList中添加时,使用addLast方法 在从LinkedList中取出时,使用removeLast方法完整代码实现
  • 22. LinkedList特性LinkedList是一个序列,该序列的元素都有一个值以及标识序列中相邻元素的链接。为了访问列表中的某个指定值,必须从第一个位置(列表头)开始,然后按照元素之间的链接前进,直至定位到指定的数据项。因此,LinkedList不是直接访问的结构,而是一种顺序访问结构 ArrayList类似于允许立即跳至任何音轨的音乐CD;而链表类似于快进才能定位新歌的音乐磁带
  • 23. 回顾ArrayListArrayList插入数据的方式
  • 24. LinkedListLinkedList插入数据的方式
  • 25. ArrayList与LinkedList异同二者的差异存在于存储元素的方式。 ArrayList使用连续存储区域中的数组,它是一种直接访问结构 LinkedList使用其元素驻留在非连续存储位置中的双链表,双链表中的每一个元素都含有标识序列中下一元素和前一元素的链接,它是一种顺序访问结构 所带方法名及其作用几乎相同,但实现不一样。
  • 26. Set的特性存入Set的每个元素都必须是唯一的。 Set与Collection有完全一样的接口 Set接口不保证维护元素的次序
  • 27. 常用的几种Set的特点HashSet:为快速查找而设计的Set TreeSet:保持次序的Set,使用它可以从Set中提取有序的序列 LinkedHashSet:具有HashSet的查询速度,且内部使用链表维护元素的顺序(插入的顺序)
  • 28. HashSet的使用向HashSet中添加的元素必须定义的两个方法: equals(Objcet o) hashCode()
  • 29. Map接口和HashMap类 4-1Accp学员应聘至外企工作,每个学员都会有一个英文名称,对应该学员对象 Jack西苑中心毕业的李明Rose西苑中心毕业的刘丽现在希望通过英文名称,获得该学员对象的详细信息,如何实现?存储方式如何选择?元素个数不确定使用集合类通过key(英文名称)获得value(学员对象)存储对象如何确定?类型:Accp学员属性:中心名称、姓名
  • 30. Map接口和HashMap类 4-2第一步,确定存储方式 1、Map接口用于维护“键-值对”的关联性,可以通过键查找值 2、HashMap是Map接口的一个具体实现类
  • 31. Map接口和HashMap类 4-3第二步:确定存储对象 1、创建类型:XTGJ学员 2、包含属性:中心名称、姓名public class Student { private String name; // 学员姓名 private String school; // 中心名称 public Student(String name, String school) { this.name = name; this.school = school; } public String toString() { return school+"毕业的"+name; } }重写Object的toString()方法,用于输出调试和描述信息
  • 32. Map接口和HashMap类 4-4第三步:具体实现 1、把英文名称与学员对象按照“键-值对”的方式存储在HashMap中 2、分别打印键集、值集、以及键-值对集合 3、判断是否存在某个键,如果是,则根据键获取相应的值 4、根据键、删除某条记录public class MapTest { public static void main(String[] args) { Student student1 = new Student("李明", "北京中心"); Student student2 = new Student("刘丽", "天津中心"); Map students = new HashMap(); students.put("Jack", student1); students.put("Rose", student2); System.out.println("键集:"+students.keySet()); System.out.println("值集:"+students.values()); System.out.println("键-值对集合:"+students); String key = "Jack"; if(students.containsKey(key)) System.out.println(students.get(key)); students.remove(key); System.out.println("键-值对集合:"+students); } }123键集:[Jack, Rose] 值集: [北京中心毕业的李明, 天津中心毕业的刘丽] 键-值对集合:{Jack=北京中心毕业的李明, Rose=天津中心毕业的刘丽} 北京中心毕业的李明 键-值对集合:{Rose=天津中心毕业的刘丽}控制台输出4
  • 33. 小结3创建一个类Book 包含属性:title(标题),使用构造方法进行初始化 重写toString()方法,用以返回Title属性的值 创建一个类BookTest,添加main方法,要求: 使用HashMap进行存储,键为Book对象的编号,值为Book对象 通过某一个编号获取Book对象,并打印该Book对象的标题
  • 34. HashMap的特性把各个Object映射起来,实现了“键--值”对应的快速存取 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键 此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
  • 35. HashMap的常用方法 voidclear()          从此映射中移除所有映射关系。 booleancontainsKey(Object key)          如果此映射包含对于指定的键的映射关系,则返回 true。 booleancontainsValue(Object value)          如果此映射将一个或多个键映射到指定值,则返回 true。 Vget(Object key)          返回指定键在此标识哈希映射中所映射的值,如果对于此键来说,映射不包含任何映射关系,则返回 null。 booleanisEmpty()          如果此映射不包含键-值映射关系,则返回 true。 Vput(K key, V value)          在此映射中关联指定值与指定键。 Vremove(Object key)          如果此映射中存在该键的映射关系,则将其删除。 intsize()          返回此映射中的键-值映射关系数。 Collectionvalues()          返回此映射所包含的值的 collection 视图。
  • 36. 集合迭代器是一个访问集合中元素的对象 可以将迭代器想像为扫描集合中整个元素范围的“定位器” 在扫描中的任何时候,迭代器能够访问对应的元素
  • 37. 迭代器生成的方法使用集合的iterator()方法能得到迭代器 eg : Iterator it = aList.iterator();
  • 38. 迭代器扫描方法迭代器具有一系列方法,这些方法允许从第一个元素到最后一个元素扫描集合以及在扫描期间访问集合中的每个元素 迭代器方法hasNext()指示集合遍历中是否还存在其他值。
  • 39. 迭代器扫描方法迭代器方法next()返回列表中要遍历的下一个元素 迭代器方法remove()删除使用next()方法从集合中返回的最后一个元素
  • 40. 迭代器扫描方法迭代器方法remove()删除使用next()方法从集合中返回的最后一个元素
  • 41. forEach“增强的for” 使编译器能够创建遍历集合的迭代器,这样就不用声明迭代器对象和使用方法hasNext()和next()来访问集合中的连续元素。 forEach语句在元素列表上隐式分配了一个迭代器,该语句通过连续调用next()方法来扫描元素列表,其中next()方法抽取元素并将其指派给局部变量 str。 eg: for(String str : list){ …… }
  • 42. 集合的综合应用有一个Student类,有姓名、年龄、成绩和email四个成员变量。 定义n(n>=5)个Student对象,并给对象赋任意属性值。要求可以对n个Student对象以任何方式进行排序。。 当姓名和年龄相同时,视为重复对象。将n个Student对象放到HashMap中,进行键的遍历、值的遍历和键值对的遍历。
  • 43. 总结 2-1请给出下面Java代码的运行结果import Java.util.*; public class TestMap { public static void main(String[] args) { AccpStudent student1 = new AccpStudent("李明", "西苑中心"); AccpStudent student2 = new AccpStudent("刘丽", "西苑中心"); AccpStudent student3 = new AccpStudent("张娜", "马甸中心"); AccpStudent student4 = student1; Map students = new HashMap(); students.put("Jack", student1); students.put("Rose", student2); students.put("Mary", student3); students.put("Rose", student4); System.out.println("键集:"+students.keySet()); System.out.println("值集:"+students.values()); } }键集:[Jack, Mary, Rose] 值集: [西苑中心毕业的李明, 马甸中心毕业的张娜, 西苑中心毕业的李明]
  • 44. 总结 2-2public class FirstLevelTitleDB { public static void main(String[] args) { FirstLevelTitle car = new FirstLevelTitle(1, "汽车", "管理员", new Date()); FirstLevelTitle test = new FirstLevelTitle(2, "高考", "管理员", new Date()); List newsTitleList = new ArrayList(); newsTitleList.put(car); newsTitleList.put(test); print(newsTitleList); } public static void print(ArrayList newsList) { for (int i = 0; i < newsList.size(); i++) { FirstLevelTitle title = (FirstLevelTitle)newsList.get(i); System.out.println(i + 1 + ":" + title.getTitleName()); } } }应使用add方法向ArrayList中添加元素 无法接收List类型的参数。采用面向接口编程的思想,此处改为List 请指出下面Java代码中的错误