携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
01.集合_集合框架体系结构介绍
1).Collection(接口):单列集合
|--List(接口):特点:1).元素有序的;2).可以存储重复元素(都是由集合内部的数据结构决定的)
|--ArrayList(子类):数组实现--线程不安全的,效率高
|--Vector(子类):数组实现--线程安全的,效率低
|--LinkedList(子类):链表实现
|--Set(接口):特点:1).无序的;2).不能存储重复元素;(都是由集合内部的数据结构决定的)
|--HashSet(子类):哈希表实现
|--LinkedHashSet(子类):链表、哈希表实现
2).Map(接口) : 双列集合
|--HashMap(子类):
|--LinkedHashMap(子类):
02.集合_Collection接口的常用方法:
添加
1).boolean add(Object e) : 向集合中添加一个元素;如果元素存储成功返回true(对于ArrayList,永远返回true);如果存储失败 返回false,例如:向HashSet中添加一个重复元素时,会返回false。
删除
2).void clear():移除此集合中的所有元素;
查询
3).boolean contains(Object o):如果当前集合中包含对象o,返回true,否则返回false;
删除
4).boolean remove(Object o) : 从集合中移除对象o,成功返回true,否则返回false
查询(获取)
5).int size():获取集合大小
查询(获取)
6).Object[] toArray():将集合内的所有元素存储到一个Object[]中,并返回。将集合转换为数组;
7).Iterator iterator():获取一个迭代器,用于遍历元素的。
03.集合_迭代器的概念_基本使用
1).迭代器:用于遍历元素的对象;
2).Collection-->iterator()
3).例如:
Collection<String> strList = new ArrayList<>();
strList.add("孙悟空");
strList.add("猪八戒");
strList.add("白骨精");
strList.add("牛魔王");
//获取迭代器
Iterator<String> it = strList.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
04.集合_迭代器
常见的问题:
1).一次判断,多次next():
....
Iterator<String> it = strList.iterator();
while(it.hasNext()){
String s = it.next();//没有被用到,被扔掉了
System.out.println(it.next());//取出下一个元素
}
2).此迭代器是"单向"的,只能使用一次;
...
Iterator<String> it = strList.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
while(it.hasNext()){//此循环不会被执行
System.out.println(it.next());
}
it = strList.iterator();//可以再次获取一个迭代器对象
while(it.hasNext()){//OK的
System.out.println(it.next());
}
05.集合_练习_迭代器操作自定义对象
Collection<Student> stuList = new ArrayList<>();
stuList.add(new Student("章子怡",20,'女'));
stuList.add(new Student("汪峰",22,'男'));
stuList.add(new Student("撒贝宁",23,'男'));
Student stu = new Student("章子怡",20,'女');
System.out.println("判断一个对象是否存在:" + stuList.contains(stu));//调用参数对象equals()方法跟集合内部的每个元素依次比较。
//获取迭代器
Iterator<Student> stuIt = stuList.iterator();
while(stuIt.hasNext()){
stu = stuIt.next();
System.out.println(stu);
}
06.集合_迭代器的并发修改异常
1).例子:
Collection<String> strList = new ArrayList<>();
strList.add("孙悟空");
strList.add("猪八戒");
strList.add("白骨精");
strList.add("牛魔王");
//获取迭代器
Iterator<String> it = strList.iterator();
while(it.hasNext()){
String s = it.next();
if("牛魔王".equals(s)){
strList.remove(s);//会导致运行时抛出"并发修改异常":ConcurrentModificationException
}
System.out.println(s);
}
2).并发修改异常产生的原因:当通过"迭代器"遍历时,通过"集合对象"去修改元素的数量,会导致"迭代器"抛出并发修改异常。
3).解决方式:
通过迭代器遍历,就通过迭代器修改
...
while(it.hasNext()){
String s = it.next();
if("牛魔王".equals(s)){
// strList.remove(s);//会导致运行时抛出"并发修改异常":ConcurrentModificationException
it.remove();//这就没问题了
}
System.out.println(s);
}
4).并不是每个元素都抛异常,比如:删除"白骨精"时就不会抛异常,原因由于next()方法的中的判断机制导致,这是一种"数值"上的巧合。并不意味着这种操作是正确的。