Java 集合框架
一.关于集合
若读者接触过c语言,就不难理解java中的集合就像是c语言中的结构体,一般数组只能存储同一种类型的数据,而集合和结构体则能存储包含多种不同类型数据的对象。例如,学生信息,在集合中以对象名即地址存储,但通过调用即能得到具体不同的数据类型,如姓名,学号,分数等。
总的来说,集合就如同一个口袋,可以放置任何东西,可以无序,可以有序,非常之方便。
二.集合框架总体结构
在Java.util包下面定义的常用的三种集合分别是:
1)Set集合,其对象不按特定顺序排列,不能有重复对象,常用子类:HashSet,TreeSet
2) List集合,其对象按特定顺序排列,允许有重复对象,常用子类:Vector,ArrayList
3)Map集合,其对象由key值和value值按照映射规则组成,常用子类:HashMap,Hashtable
注:java中的集合都是以接口定义的,其中Set集合和List集合同属于Collecton的子类,而Map集合则是单独自成一类,没有父类。
以下就从三种集合的基本操作切入,讲解示范以下如何用他们实现对学生信息的增删查改等功能:
A Set
public Set<Student> creatSet(int size) { // 实例化一个set对象,其子类HashSet Set set = new HashSet<Student>(); // 创建循环数产生成绩 Random rand = new Random(); // 添加Student对象进去,传入姓名和成绩 for (int i = 0; i < size; i++) { String name = "学生" + (char) (65 + i); set.add(new Student(name, rand.nextInt(100))); } return set; }
public void findInformation(Set<Student> set, int grade) { // set是无序的,不能根据所以查找,必须得到迭代器,是接口,不能实例化创建对象 Iterator<Student> it = set.iterator(); // 调用迭代器中的hasNext方法,判断是否存在下一个,作为判断的条件 while (it.hasNext()) { // 获取下一个元素 Student stu = it.next(); // 判断 if (stu.getGrade() >= grade) { // 如果符合查找的条件,就输出学生信息 System.out.println(stu.toString()); } } }
public void deleteInformation(Set<Student> set, int grade) { // 获取迭代器,泛型指定为Student类型 Iterator<Student> it = set.iterator(); // 创建一个set集合,用来放置待被删除元素 // Set<Student> newSet = new HashSet(); while (it.hasNext()) { // 获取下一个元素 Student stu = it.next(); if (stu.grade < grade) { // 注,这里不能一个一个删除,由于是不连续的,删除后将得不到下一个元素的位置,只能将符合删除的元素放置另一个集合中,此时选用set集合 newSet.add(stu);// 将元素添加到newSet集合中 } } // 全部遍历完,一起删掉符合条件的元素,用Set集合中的removeAll方法 set.removeAll(newSet); }
B List
List集合中由于对象是按顺序存储的,按条件查找元素的时候就无需用到迭代器,根据List集合的大小直接循环遍历即可,需要注意的是,删除对象的时候,循环条件中i++,应该放在else if语句中,否则将出现部分符合条件的对象无法删除,其原因读者可以想想哈~~
C Map<key,value>
1)增加对象时,Map集合中没有add()方法,只能用put(key,value)方法,将key值和value值和其一对一的关系添加至Map集合中。
2)删除对象时,Map集合中既不能直接将对象一个一个删除,也不能像Set集合将对象放置在另一个Map集合中,利用removeAll一起删除,只能用keySet()方法先返回所有key值存储在一个Set集合中,再创建迭代器,得到每个key值,用get(key)方法得到对应的value值,将符合条件对象的key值存储在另一个Set集合中,完成遍历后,再得到迭代器,循环用remove(key)方法删除对应对象。
public void deleteInformation(Map<String, Student> map, int grade) { // 获取map集合key值的set集合 Set<String> set = map.keySet(); // 获取迭代器,泛型指定为Student类型 Iterator<String> it = set.iterator(); while (it.hasNext()) { // 获取下一个元素 String key = it.next(); // 由key值得到stu Student stu = map.get(key ); // 比较 if (stu.grade < grade) { // 注,这里不能一个一个删除,由于是不连续的,删除后将得不到下一个元素的位置,只能将符合删除的元素放置另一个集合中,此时选用set集合 newSet.add(key );// 将学号即key值添加到newSet集合中 System.out.println(stu.toString()); } } // 得到newSet集合的迭代器 it = newSet.iterator(); while (it.hasNext()) { // 获取key 值 String key= it.next(); map.remove(key);//在map集合中删掉对应key值 } }
三.结束语
以上只是介绍了最基本子类和方法的使用,希望读者和我可以多学习,多加交流。