NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
# 集合框架 ## 什么是集合 Java中的集合是工具类,可以存储任意数量的具有共同属性的对象。 > 集合类存放于java.util包中。 > 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用 > 在集合框架中,主要分为 Collection 和 Map 两大接口。 > 在 Collection 中又分为 List (有序集合) 和 Set (无序集合)。List 和 Set 都是接口。 > 其中Collection存储的是元素,Map存储的key-value键值对。 > 集合框架存储的元素可以是不定长的,即可以任意的添加,但是数组在定义的时候就确定了长度。实际开发中,对于同类型数据的结构,一般使用 Collection 结构会较多。 ## Collection ![](https://img.kancloud.cn/57/5a/575a8b4a5f479df91165f236ea99381b_1004x562.png) 在Collection中,根据不同的数据结构是使用方法,分为Set(无序的数据集合,元素不可重复)、Queue(队列)、List(有序的集合,元素可以重复)。 在Collection中的定义中Interface Collection,是一种泛型结构,意思是在使用Collection定义对象的时候,需要指定存储的元素数据类型(强调:**在集合中存储的数据元素必须都是引用数据类型**)。 ### List list中的内容是有序的并且可以重复的,我们也称之为序列; list可以精确的控制每个元素的插入位置,或者删除某个位置的元素; > 是实际开发中用的最多的一种数据结构,存储的单个元素,使用**泛型**去强制约束 List 中存放的是一致的数据类型 > 在List接口中,最常用的实现类为ArrayList和LinkedList,其中ArrayList是运用最多的。 **语法** ~~~ List<E> list = new ArrayList<E>(); ~~~ **插入元素** add() **遍历元素** * 通过元素索引下标方式 for 循环 * 通过 foreach 循环 * 通过迭代器 Iterator **删除元素** 如果通过遍历去查找相关元素进行删除的时候,不要使用 list.remove(int index) 该方法,因为使用该方法,会动态的直接改变集合的元素结构,导致遍历的不完整或者有错误。要使用迭代器遍历集合,调用 Iterator.remove() 方法删除。 ### Set 不详细阐述,在遍历的时候不能使用索引方式,只能通过迭代器和 foreach。 ## Map ![](https://img.kancloud.cn/e1/bd/e1bd5e2144e1efcd3111df395aea5eb5_954x491.png) 类似的可以理解给集合元素中的值定义了一个 Key 键(遍历),之后可以通过相关的方法快速的定位到具体的 Value 中。 Map中存储是key-value键值对,在Map接口中,我们主要使用的实现类为HashMap。 在使用HashMap类的时候,插入的顺序和最后遍历出来的顺序可以是有差异的,因为本身HashMap结构它是无序的。 通过map.put(key, value)方法进去数据的写入,同样的要注意使用泛型。(强调:**Map中的key键和value值的数据元素必须都是引用数据类型**)。 * * * **语法** ~~~ Map<k,v> map= new HashMap<k,v>(); ~~~ **获取某个 key 的 value** Value get(Key) **如何遍历 Map 结构** 获取 Map 的 Key 集合,通过遍历 Key 集合,获取 Value 值。 1. 获取 key 集合:map.keySet(); 2. 遍历 Key 集合:iterator; 3. 获取 Value 值:get(key); ## 开发注意事项 在实际开发中,List 一般使用 ArrayList 实现类去构建,Map 一般使用 HashMap 实现类去构建。 要掌握对于 List 和 Map 的添加元素、遍历元素。 要认识集合框架中关于对象在内存中的存储方法。 ## 本节课的代码片段 ~~~java public class Students { private String name; private String code; public Students() { } public Students(String code, String name) { this.code = code; this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } @Override public String toString() { return "Students [name=" + this.getName() + ", code=" + this.getCode() + "]"; } } public class Demo { public static void main(String[] args) { Students qdd = new Students("001","仇冬冬"); Students drm = new Students("002","丁润萌"); Clazz amateur = new Clazz(); amateur.setCode("j01"); amateur.setName("JAVA业余班"); List<Students> stu = new ArrayList<Students>(); //list中使用add()方法,来添加元素 stu.add(qdd); stu.add(drm); //当我们想要在list集合中追加元素的时候,同样使用add()方法 Students qh = new Students("003","邱晗"); stu.add(qh); /*for(int i = 0; i < stu.size(); i++) { //list集合中,通过索引的方式,来查找集合中的元素get() System.out.println(stu.get(i)); } System.out.println("************"); //通过size()方法查看集合的大小 System.out.println(stu.size()); //所以 list集合中索引的范围是0~size-1; //这是错误的,因为我们的索引超过了,索引的范围 //stu.get(3); //通过传入索引来删除索引对应的元素 stu.remove(0); for(int i = 0; i < stu.size(); i++) { System.out.println(stu.get(i)); } //通过传入对象来删除集合中对应的对象 //stu.remove(qdd); //for循环查询list中的元素 for(int i = 0; i < stu.size(); i++) { System.out.println(stu.get(i)); } System.out.println("-------------------------"); //使用foreach() 查询list中的元素 for(Students st : stu) { System.out.println(st); } System.out.println("-------------------------"); //创建迭代器 Iterator<Students> it = stu.iterator(); while(it.hasNext()) { //student对象就是我们遍历出来的集合的对象 Students student = it.next(); System.out.println(student); }*/ //集合中元素的修改 for(int i = 0; i < stu.size(); i++) { Students student = stu.get(i); String name = student.getName(); if(name.equals("邱晗")) { student.setCode("070"); } } for(Students st : stu) { System.out.println(st); } System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"); //如何在list集合中进行循环删除 /*for(int i = 0; i < stu.size(); i++) { Students student = stu.get(i); System.out.println(student.getName()); String name = student.getName(); if(name.equals("丁润萌")) { stu.remove(i);//这样的实现是有问题的 System.out.println(stu.size()); } } for(Students st : stu) { System.out.println(st); }*/ //使用迭代器进行迭代器中的遍历删除 Iterator<Students> it = stu.iterator(); while(it.hasNext()) { //student对象就是我们遍历出来的集合的对象 Students student = it.next(); String name = student.getName(); if(name.equals("丁润萌")) { it.remove(); } } System.out.println("处理完的结果————————————————————"); Iterator<Students> it2 = stu.iterator(); while(it2.hasNext()) { Students st = it2.next(); System.out.println(st); } } } ~~~ ~~~ public class Demo { public static void main(String[] args) { Students qdd = new Students("001","仇冬冬"); Students drm = new Students("002","丁润萌"); Students lzj = new Students("003","刘子杰"); //map集合中添加元素的方式 Map<String,Students> map = new HashMap<String,Students>(); map.put("qdd", qdd); map.put("drm", drm); map.put("lzj", lzj); //map集合中元素的查找 System.out.println(map.get("qdd")); System.out.println("***************"); //针对map集合中元素的修改 Students stu = map.get("qdd"); stu.setCode("007"); //遍历map集合 //第一步:获取map中的key集合; Set<String> set = map.keySet(); //第二部:迭代key集合 Iterator<String> it = set.iterator(); while(it.hasNext()) { String key = it.next(); System.out.println(key); Students st = map.get(key); System.out.println(st); } Students wc = new Students("004","王晨"); map.put("wc", wc); //删除元素 map.remove("wc"); //这样是错误的 /*Iterator<String> it1 = set.iterator(); while(it1.hasNext()) { String key = it1.next(); if(key.equals("wc")) { map.remove(key); } } System.out.println(map);*/ } } ~~~ ## 练习 定义一个方法listTest(List\<Integer> al, Interger s),要求返回s在al里面第一次出现的索引,如果s没有出现返回-1 ~~~java public class Demo { public static int listTest(List<Integer> al, Integer s) { /*int result = al.indexOf(s); return result;*/ for(int i = 0; i < al.size(); i++) { //al.get(i) == s if(al.get(i).equals(s)) { return i; } } return -1; } public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); list.add(6); list.add(2); list.add(4); list.add(5); list.add(1); list.add(4); int a = listTest(list,4); System.out.println(a); } } ~~~ 现有一个map集合,如下: ~~~ Map<String,String> map = new HashMap<String,String>(); map.put("001","仇冬冬"); map.put("002","丁润萌"); map.put("003","刘子杰"); map.put("004","邱晗"); ~~~ 要求: 1. 遍历集合,并将人名与学号对应的打印出来 2. 向该集合插入一条学号为“005”的王晨的信息 3. 要去移除该map中仇冬冬的信息 4. 将map集合中学号为002的学生姓名改为小丁 ~~~ Map<String,String> map = new HashMap<String,String>(); map.put("001","仇冬冬"); map.put("002","丁润萌"); map.put("003","刘子杰"); map.put("004","邱晗"); map.put("005", "王晨"); map.remove("001"); map.put("002", "小丁"); Set<String> set = map.keySet(); Iterator<String> it = set.iterator(); while(it.hasNext()) { String key = it.next(); System.out.println("学号:" + key + " 姓名:" + map.get(key)); } ~~~ 有两个数组,第一个数组内容为:【黑龙江省,浙江省,江西省,广东省,福建省】,第二个数组的内容为:【哈尔滨,杭州,南昌,广州,福州】,将第一个数组元素作为key,第二个数组的元素作为value存储到Map集合中,如【黑龙江=哈尔滨,浙江省=杭州】 ~~~ String[] province = {"黑龙江省","浙江省","江西省","广东省","福建省"}; String[] city = {"哈尔滨","杭州","南昌","广州","福州"}; Map<String,String> map = new HashMap<String,String>(); for(int i = 0; i < province.length; i++) { map.put(province[i],city[i]); } System.out.println(map); ~~~ ~~~ List<String> province = new ArrayList<String>(); province.add("黑龙江省"); province.add("福建省"); province.add("浙江省"); province.add("广东省"); province.add("江西省"); List<String> city = new ArrayList<String>(); city.add("杭州"); city.add("哈尔滨"); city.add("广州"); city.add("福州"); city.add("南昌"); Map<String,String> map = new HashMap<String,String>(); for(int i = 0; i < province.size(); i++) { String pro = province.get(i); for(int j = 0; j < city.size(); j++) { String ci = city.get(j); if("黑龙江省".equals(pro)) { if("哈尔滨".equals(ci)) { map.put(pro, ci); } else { continue; } } else if("福建省".equals(pro)) { if("福州".equals(ci)) { map.put(pro, ci); } else { continue; } } else if("浙江省".equals(pro)) { if("杭州".equals(ci)) { map.put(pro, ci); } else { continue; } } else if("广东省".equals(pro)) { if("广州".equals(ci)) { map.put(pro, ci); } else { continue; } } else if("江西省".equals(pro)) { if("南昌".equals(ci)) { map.put(pro, ci); } else { continue; } } } } System.out.println(map); ~~~