本帖最后由 小石姐姐 于 2018-5-17 08:54 编辑
第18天 集合 今日内容介绍 u 集合的回顾与迭代器使用 u 泛型的定义和使用 u 斗地主综合案例 第1章 集合的回顾与迭代器使用1.1 集合的回顾
1.1.1 集合的创建创建集合的常用格式在此说明一下: A:导包:import java.util.ArrayList; B:创建对象:与其他普通的引用数据类型创建方式完全相同,但是要指定容器中存储的数据类型: ArrayList<要存储元素的数据类型> 变量名 = new ArrayList<要存储元素的数据类型>(); 集合中存储的元素,只能为<>括号中指定的数据类型元素; “<要存储元素的数据类型>”中的数据类型必须是引用数据类型,不能是基本数据类型; 下面给出8种基本数据类型所对应的引用数据类型表示形式:
1.1.2 集合的常用方法
1.1.3 案例代码一:package com.itheima01; import java.util.ArrayList;
/* * 持有数据: * 单一数据,可以定义对应类型的变量直接持有 * 多个数据,可以使用数组的方式记录,通过索引访问数据 * 又在面向对象的基础上,可以使用集合的方式记录,最开始最常用ArrayList,该集合类同样可以通过索引访问数据 * * 集合的基本使用: * 1创建集合对象 * 2向集合中添加元素 * 3从集合中获取元素/其他信息(集合的长度) */ public class Demo01ArrayList {
public static void main(String[] args) {
//创建集合对象 ArrayList<Integer> list = new ArrayList<Integer>(); //向集合中添加元素 list.add(10); list.add(100); list.add(2000); //从集合中获取元素/其他信息(集合的长度) Integer integer = list.get(2); System.out.println(integer);
int size = list.size(); System.out.println(size); System.out.println("==============================="); //遍历集合 for (int i = 0; i < list.size(); i++) { //通过索引依次获取集合中每一个元素 Integer thisNumber = list.get(i); //打印每个元素 System.out.println(thisNumber); } } }
1.2 迭代器在eclipse使用时,可以配合文档注释,导出对类的说明文档,从而供其他人阅读学习与使用。 通过使用文档注释,将类或者方法进行注释用@简单标注基本信息。如@author 作者、@version代码版本、@param方法参数、@return方法返回值等。 1.2.1 迭代器概述java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。 我们要取出这些集合中的元素,可通过一种通用的获取方式来完成。 Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。 集合中把这种取元素的方式描述在Iterator接口中。Iterator接口的常用方法如下: hasNext()方法:用来判断集合中是否有下一个元素可以迭代。如果返回true,说明可以迭代。 next()方法:用来返回迭代的下一个元素,并把指针向后移动一位。 1.2.1.1 案例代码二:package com.itheima01; import java.util.ArrayList; import java.util.Iterator;
/* * 在java当中不止ArrayList一个集合,java提供了众多的集合. * * 不同的容器完成不同方式的数据存储. * 不同集合的特点不同,ArrayList有序且可重复且带索引的集合.但是有的集合不带索引.所以如果使用其他集合,可能无法通过get+索引的方式获取元素 * * 所有集合的通用获取元素方法并不是通过索引获取,而是通过迭代器获取. * 迭代器:iterator */ public class Demo02iterator {
public static void main(String[] args) {
//创建集合对象 ArrayList<Integer> list = new ArrayList<Integer>();
//向集合中添加元素 list.add(10); list.add(100); list.add(2000);
//获取该集合的迭代器 Iterator<Integer> iterator = list.iterator();
//使用迭代器的方法,迭代集合(遍历集合) while(iterator.hasNext()) { //获取集合中元素 Integer thisNumber = iterator.next(); System.out.println(thisNumber); } }
}
1.2.2 迭代器迭代原理1.2.2.1 案例代码三:package com.itheima01;
import java.util.ArrayList; import java.util.Iterator;
/* * 集合用来持有数据,所有常用集合都具备了可迭代功能iterator方法,该方法用于迭代集合,该方法才是最为通用的集合迭代方法。 * * 迭代器:集合迭代(集合遍历)的工具 * * 集合的获取迭代器方法 * public Iterator<E> iterator() 获取某个集合的迭代器实例对象 * * Iterator:迭代器接口 * boolean hasNext() 判断集合中是否有下一个元素 不移动元素指针 * E next() 获取集合中下一个元素 移动指针,指向下一个元素 */ public class Demo03iterator {
public static void main(String[] args) {
//创建集合对象 ArrayList<Integer> list = new ArrayList<Integer>();
//向集合中添加元素 list.add(10); list.add(100); list.add(2000);
//调用集合的iterator方法,返回迭代器对象 Iterator<Integer> itr = list.iterator();
//混合使用hasNext与next方法,循环获取元素 while(itr.hasNext()) { //如果有元素,就获取元素 Integer thisNumber = itr.next(); System.out.println(thisNumber); }
}
}
迭代集合元素图解:
1.2.3 迭代器迭代自定义数据类型A:定义一个Person类,里面有姓名和年龄属性,生成对应的getter/setter方法以及满参构造,空参构造 B:定义一个测试类,在测试类中定义一个集合,集合中存储三个Person对象,这三个人的属性分别为 Jack,18岁 Rose,16岁 Trump,62岁 C:最终遍历该集合,分别打印出这三个人的姓名和年龄 并且统计出三个人的总年龄打印在控制台上
1.2.3.1 案例代码四: package com.itheima01;
/* * 人类: * 年龄 姓名 */ public class Person {
private String name; private int age;
public Person() { super(); }
public Person(String name, int age) { super(); this.name = name; this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
package com.itheima01;
import java.util.ArrayList; import java.util.Iterator;
/* * 使用集合存储多个Person对象,将该集合中的所有Person对象的年龄相加,求得总年龄 */ public class Demo04 {
public static void main(String[] args) {
//创建集合对象 ArrayList<Person> list = new ArrayList<Person>(); //向集合中添加元素 Person p = new Person("Jack",18); Person p2 = new Person("Rose",16); Person p3 = new Person("Trump",62);
list.add(p); list.add(p2); list.add(p3); //调用集合的iterator方法,返回迭代器对象 Iterator<Person> itr = list.iterator();
//定义变量,记录年龄综合 int sum = 0;
//混合使用hasNext与next方法,循环获取元素 while(itr.hasNext()) { //如果有元素,就获取元素 Person thisP = itr.next(); System.out.println(thisP.getAge()+"岁的"+thisP.getName()); //年龄累加 sum += thisP.getAge(); }
//查看总年龄 System.out.println(sum); }
}
1.2.4 并发修改异常在前一个迭代器迭代自定义数据类型的基础上,添加新的需求: 使用集合存储多个Person对象,当遇到16岁的人时,就添加一个90岁的人 1.2.4.1 案例代码五: package com.itheima01;
/* * 人类: * 年龄 姓名 */ public class Person {
private String name; private int age;
public Person() { super(); }
public Person(String name, int age) { super(); this.name = name; this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
}
package com.itheima01;
import java.util.ArrayList; import java.util.Iterator;
/* * 使用集合存储多个Person对象,当遇到16岁的人时,就添加一个90岁的人 * * 该例中可能会产生并发修改异常:迭代器所认为的集合状态与集合真正的状态不统一了!就会出现该异常. */ public class Demo05ConcurrentModificationException {
public static void main(String[] args) { //创建集合对象 ArrayList<Person> list = new ArrayList<Person>(); //向集合中添加元素 Person p = new Person("Jack",18); Person p2 = new Person("Rose",16); Person p3 = new Person("Trump",62); Person p4 = new Person("Obama",56); Person p5 = new Person("Castro",90);
list.add(p); list.add(p2); list.add(p3); list.add(p4); //调用集合的iterator方法,返回迭代器对象 Iterator<Person> itr = list.iterator();
//混合使用hasNext与next方法,循环获取元素 while(itr.hasNext()) { //如果有元素,就获取元素 Person thisP = itr.next(); //判断年龄是否为16岁 if(thisP.getAge() == 16) { //如果存在16岁的人,就加入90岁的卡斯特罗 list.add(p5); } }
}
} 运行上述代码发生了错误 java.util.ConcurrentModificationException这是什么原因呢? 在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。 解决并发修改异常,重新获取迭代器 1.2.4.2 案例代码六:package com.itheima01; import java.util.ArrayList; import java.util.Iterator;
/* * 使用集合存储多个Person对象,当遇到16岁的人时,就添加一个90岁的人 * * 该例中可能会产生并发修改异常:迭代器所认为的集合状态与集合真正的状态不统一了!就会出现该异常. */ public class Demo05ConcurrentModificationException {
public static void main(String[] args) { //创建集合对象 ArrayList<Person> list = new ArrayList<Person>(); //向集合中添加元素 Person p = new Person("Jack",18); Person p2 = new Person("Rose",16); Person p3 = new Person("Trump",62); Person p4 = new Person("Obama",56); Person p5 = new Person("Castro",90);
list.add(p); list.add(p2); list.add(p3); list.add(p4); //调用集合的iterator方法,返回迭代器对象 Iterator<Person> itr = list.iterator();
//混合使用hasNext与next方法,循环获取元素 while(itr.hasNext()) { //如果有元素,就获取元素 Person thisP = itr.next(); //判断年龄是否为16岁 if(thisP.getAge() == 16) { //如果存在16岁的人,就加入90岁的卡斯特罗 list.add(p5); //当集合加入了一个元素后,就不要再使用迭代器操作元素了 break; } }
//重新打印集合结果 Iterator<Person> itr2 = list.iterator();
while (itr2.hasNext()) { Person person = (Person) itr2.next(); System.out.println(person.getAge()+"岁的"+person.getName()); } }
}
1.3 增强for增强for循环是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。 1.3.1 增强for格式for(元素的数据类型 变量 : Collection集合or数组){ } 1.3.2 案例代码七:package com.itheima01;
import java.util.ArrayList;
/* * foreach循环(又叫增强for循环)来完成容器中元素的获取 * * 增强for循环用来迭代集合或数组,格式如下: * for(容器内类型 临时变量:容器) { * 内部可以直接使用临时变量访问数据 * } * * 增强for循环源代码底层就是迭代器.所以不能在增强for循环的过程当中为集合添加或者删除元素.因为会产生并发修改异常. * 所以,增强for循环只用来查看数据,不作数据修改. */ public class Demo06foreach {
public static void main(String[] args) {
//创建集合对象 ArrayList<Integer> list = new ArrayList<Integer>(); //向集合中添加元素 list.add(10); list.add(100); list.add(2000);
//使用增强for循环迭代集合 for(Integer thisNumber : list) { System.[s |