集合
集合类的特点:提供一种存储空间可变的的存储模型。
集合只能存储引用类型的数据。
集合:
Collection(单列)和Map(双列)
Collection(单列): List(可重复) Set(不可重复)
Map(双列):HashMap TreeMap 等(实现类)
List(可重复):ArrayList LinkList (实现类)
Set(不可重复):HashSet LinkedHashSet TreeSet(实现类)
(上下是继承关系,父类有的方法,子类都有,还有自己的特有的方法)
1.Collection集合
常用方法:
public boolean add(E e)
: 把给定的对象添加到当前集合中 。public void clear()
:清空集合中所有的元素。public boolean remove(E e)
: 把给定的对象在当前集合中删除。public boolean contains(E e)
: 判断当前集合中是否包含给定的对象。public boolean isEmpty()
: 判断当前集合是否为空。public int size()
: 返回集合中元素的个数。public Object[] toArray()
: 把集合中的元素,存储到数组中。- public Iterator iterator():返回该集合的迭代器。
Iterator接口
集合的专用遍历方式
常用方法:
-
-
boolean
hasNext()
如果迭代具有更多元素,则返回true
。E
next()
返回迭代中的下一个元素。使用集合遍历String类型数据
-
public class CollectionDemo {
public static void main(String[] args) {
Collection<String> strArr = new ArrayList<>();
strArr.add("Hello");
strArr.add("Word");
strArr.add("Java");
strArr.add("J2ee");
Iterator<String> strI = strArr.iterator();
while (strI.hasNext()){
//遍历
String s = strI.next();
System.out.println(s);
}
}
}
在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。
使用集合遍历学生对象
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Demo {
public static void main(String[] args) {
Collection<Student> stuArr = new ArrayList<>();
Student s1 = new Student("马瑞",21);
Student s2 = new Student("张骞骞",21);
Student s3 = new Student("谢祥",21);
stuArr.add(s1);
stuArr.add(s2);
stuArr.add(s3);
Iterator<Student> stuI = stuArr.iterator();
while (stuI.hasNext()){
Student s = stuI.next();
System.out.println("姓名:"+s.getName()+" 年龄:"+s.getAge());
}
}
}
1.1List集合
List集合特点:
有序: 存储和取出的元素顺序一致
可重复: 存储的元素可以重复
有索引:可以通过整数索引访问元素
特有方法:
public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
List集合存储学生对象并遍历
List<Student> studentArr = new ArrayList<>();
Student s4 = new Student("马",21);
Student s5 = new Student("谢",21);
Student s6 = new Student("张",21);
studentArr.add(s4);
studentArr.add(s5);
studentArr.add(s6);
Iterator<Student> ii = studentArr.iterator();
while (ii.hasNext()){
Student next = ii.next();
System.out.println("姓名:"+next.getName()+" 年龄:"+next.getAge());
}
并发修改异常
public class ErrorDemo {
public static void main(String[] args) {
List<String> strArr = new ArrayList<>();
strArr.add("Hello");
strArr.add("Word");
strArr.add("Java");
strArr.add("J2ee");
// Iterator<String> strI = strArr.iterator();
// while (strI.hasNext()){
// String s = strI.next();//预期修改值和实际修改值不一致
// if (s.equals("Java")){
// strArr.add("Javaee");
// }
// System.out.println(s);
// }
for (int i = 0; i <strArr.size() ; i++) {
String s = strArr.get(i);
if (s.equals("Java")) {
strArr.add("Javaee");
}
System.out.println(s);
}
}
}
Exception in thread “main” java.util.ConcurrentModificationException
at java.util.ArrayList I t r . c h e c k F o r C o m o d i f i c a t i o n ( A r r a y L i s t . j a v a : 909 ) a t j a v a . u t i l . A r r a y L i s t Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList Itr.checkForComodification(ArrayList.java:909)atjava.util.ArrayListItr.next(ArrayList.java:859)
at cn.taru.day02.time04.ErrorDemo.main(ErrorDemo.java:17)
ConcurrentModificationException并发修改异常
- 当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。
产生原因
迭代器遍历的过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
解决方率
用for循环遍历,然后用集合对象做对应的操作即可
ListIterator(List中特有的迭代器)extend Iterator
Listlterator: 列表迭代器
1.通过List集合的listlterator()方法得到,所以说它是List集合特有的迭代器
2.用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
Listlterator中的常用方法:
E next():返回迭代中的下一个元素
boolean hasNext():如果迭代具有更多元素,则返回trueE previous():返回列表中的上一个元素
boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
void add(Ee):将指定的元素插入列表
不演试了
增强for循环
增强for:简化数组和Collection集合的遍历
实现lterable接口的类允许其对象成为增强型for语句的目标
它是JDK5之后出现的,其内部原理是一个lterator迭代器
int[] arr = {
1,3,5,8};
for(int i:arr){
//for(元素数据类型 变量名:数组或集合){}
i.sout
}
public class Demo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Word");
list.add("Java");
for (String s : list){
//举例
System.out.println(s);
}
}
}
案例(三种遍历方式)
public class ListDemo {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
Student s1 = new Student("马瑞",21);
Student s2 = new Student("谢祥",22);
Student s3 = new Student("张骞骞",21);
list.add(s1);
list.add(s2);
list.add(s3);
//第一种:迭代器
ListIterator<Student> it = list.listIterator();
while (it.hasNext()){
Student stu1 = it.next();
System.out.println("姓名:"+stu1.getName()+" 年龄:"+stu1.getAge());
}
System.out.println("-----------");
//第二种:普通for循环
for (int i = 0; i <list.size() ; i++) {
Student stu2 = list.get(i);
System.out.println("姓名:"+stu2.getName()+" 年龄:"+stu2.getAge());
}
System.out.println("-----------");
//第三种:增强for循环
for (Student stu3 : list){
System.out.println("姓名:"+stu3.getName()+" 年龄:"+stu3.getAge());
}
}
}
数组和链表的优缺点(Arraylist, LinkedList)
数组是一种增删慢、查询快的一种数据模型
链表是一种增删快、查询慢的一种数据模型
Arraylist底层数据结构是数组
LinkedList底层数据结构是链表
1.1.1ArrayList
略
1.1.2LinkedList
案例LinkedList集合存储学生对象用三种方式遍历
public class ListDemo {
public static void main(String[] args) {
LinkedList<Student> list = new LinkedList<>();
Student s1 = new Student("马瑞",21);
Student s2 = new Student("谢祥",22