一、collection 带all的方法
package day14;
import java.util.ArrayList;
import java.util.Collection;
public class Test01 {
public static void main(String[] args) {
Collection cal1 = new ArrayList();
cal1.add("a");
cal1.add("b");
cal1.add("c");
cal1.add("d");
Collection cal2 = new ArrayList();
cal2.add("a");
cal2.add("b");
cal2.add("e");
cal2.add("f");
cal2.add("g");
boolean flag =cal1.addAll(cal2);//添加
System.out.println(flag);
// System.out.println(cal1.removeAll(cal2));//去除交集
/*System.out.println(cal1.retainAll(cal2));//获取交集,变成交集
System.out.println(cal2.containsAll(cal1));//是否包含*/
System.out.println(cal1);
System.out.println(cal2);
}
}
二、集合遍历的第一种方式(转数组)
1.将集合转换为数组来进行遍历
2.方法:Object[] toArray()
Collection cal = new ArrayList();
cal.add("张三");
cal.add("李四");
cal.add("王五");
cal.add("赵六");
cal.add("周七");
Object[] obj = cal.toArray();
//System.out.println(Arrays.toString(obj));
for (int i = 0; i < obj.length; i++) {
System.out.println(obj[i]);
}
注意存储内容为对象时要重写toString方法
三、集合第二种遍历方法(迭代器)
1.将集合转换为迭代器来进行遍历
2.方法:Iterator iterator()
Collection cal = new ArrayList();
cal.add("张三");
cal.add("李四");
cal.add("王五");
cal.add("赵六");
cal.add("周七");
Iterator it = cal.iterator();
while (it.hasNext()){
Object next = it.next();
System.out.println(next);
}
四、集合第三种遍历(增强for)
1.使用增强for循环
2.语法:
for(集合|数组元素的数据类型 变量名 : 需要遍历集合|数组) {
变量名 就是每次得到集合|数组中元素
}
3.注意点:
A.增强for循环遍历的方式也是使用迭代器来进行遍历
Collection cal = new ArrayList();
cal.add("张三");
cal.add("李四");
cal.add("王五");
cal.add("赵六");
cal.add("周七");
for (Object o : cal) {
System.out.println(o);
}
五、迭代器遍历的原理
六、List接口
1.概念:所在包名是 java.util List是一个接口 不能实例化 只能实例化实现类即实例化子类
collection也是接口,且是集合的根接口,是list接口的父类
2.特点:有序的 存的顺序与取的顺序是一样的 可以重复 也是设置null元素
3.实现类:ArrayList LinkedList Vector
4.常用的方法 带索引的方法
5.list有索引值,collection无索引
package com.qf.demo03;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List li = new ArrayList();
li.add("张三");
li.add("李四");
li.add("王五");
li.add("赵六");
System.out.println(li);
li.add(1,"吴");
System.out.println(li);
li.set(2,"叶");
System.out.println(li);
//根据索引来获取某一个元素
System.out.println(li.get(1));
li.remove(1);
System.out.println(li);
}
}
七、集合第四种遍历(有序 索引)
package com.qf.demo03;
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
List li = new ArrayList();
li.add("周");
li.add("潘");
li.add("张");
//使用第四种遍历方式
for (int i=0;i<li.size();i++){
//通过索引来获取元素
Object o = li.get(i);
System.out.println(o);
}
}
}
代码 存储对象的集合
package com.qf.demo04;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Test {
public static void main(String[] args) {
//实例化集合
List li = new ArrayList();
//实例化学生对象
Student stu1 = new Student("张",18,"男");
Student stu2 = new Student("周",16,"男");
Student stu3 = new Student("潘",20,"女");
//将对象存入到集合中
li.add(stu1);
li.add(stu2);
li.add(stu3);
//使用第四种方式进行遍历
for (int i=0;i<li.size();i++){
System.out.println(li.get(i));
}
//使用循环遍历
int age= ((Student)(li.get(0))).getAge();
//定义一个变量来记录索引
int index =-1;
for (int i=0;i<li.size();i++){
Student st = (Student) li.get(i);
if (st.getAge() >age){
age =st.getAge();
//将索引记录
index =i;
}
}
((Student) (li.get(index))).setName("小猪佩奇");
System.out.println(li);
}
}
注意:将获得的集合对象进行向下转型,因为集合取出的对象自动向上转型为Object类,所以需要向下转为Student类才能调取Student类的方法
八、Listlterator
listIterator 有remove add set 三种常用方法 增删改
package com.qf.demo05;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test {
public static void main(String[] args) {
List li = new ArrayList();
li.add("张无忌");
li.add("张三丰");
li.add("张小龙");
li.add("张学友");
//将集合中转换为迭代器
ListIterator iterator = li.listIterator();
//将指针移动到最后
while (iterator.hasNext()){
iterator.next();
}
while (iterator.hasPrevious()){
Object o = iterator.previous();
System.out.println(o);
}
}
}
理解:就是转为特殊的ListIterator迭代器,可以避免并发异常
九、并发异常
package com.qf.demo05;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class Test01 {
public static void main(String[] args) {
List li = new ArrayList();
li.add("小沈阳");
li.add("宋小宝");
li.add("赵四");
li.add("文松");
//将集合转换为迭代器
Iterator iter = li.iterator();
while (iter.hasNext()){
String s = (String) iter.next();
if (s.equals("赵四")){
li.add("小吴");
}
}
System.out.println(li);
}
}
问题
A.问题:
Exception in thread “main” java.util.ConcurrentModificationException
当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常 ==>并发异常
B.原因:
使用迭代器遍历数据 同时又在是集合在添加数据 添加数据 并没有通知迭代器已经修改集合数据了
就会出现并发异常
C.解决方法:
A.使用常规遍历方式 同时来操作集合
B.使用迭代器进行遍历 使用迭代器来添加数据
第一种 普通for
package com.qf.demo05;
import java.util.ArrayList;
import java.util.List;
public class Test02 {
public static void main(String[] args) {
List li = new ArrayList();
li.add("小沈阳");
li.add("宋小宝");
li.add("赵四");
li.add("文松");
for (int i=0;i<li.size();i++){
String s = (String) li.get(i);
if (s.equals("赵四")){
li.add("吴");
}
}
System.out.println(li);
}
}
第二种 listIteraor
package com.qf.demo05;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Test03 {
public static void main(String[] args) {
List li = new ArrayList();
li.add("小沈阳");
li.add("宋小宝");
li.add("赵四");
li.add("文松");
//转换为迭代器
ListIterator iter = li.listIterator();
while (iter.hasNext()){
String s = (String) iter.next();
if (s.equals("赵四")){
iter.add("吴");
}
}
System.out.println(li);
}
}
十、ArrayList
1.ArrayList是List接口的实现类
2.ArrayList 底层实现是以数组的方式进行存储 特点:查询快 增删慢
3.此实现不是同步的 多线程中不安全的
4.数组存储方式的特点分析
十一、LinkedList
1.是List接口实现类
2.以链表的方式来进行存储 特点:查询慢 增加删除快
3.此实现不是同步的 多线不安全
3.链表存储的特点分析
常用方法
两者比较
package day14;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Test07 {
public static void main(String[] args) {
array();//增删link快 查找array快
link();
}
public static void array(){
List li = new ArrayList();
//long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
li.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
li.get(i);
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
public static void link(){
LinkedList li = new LinkedList();
//long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
li.add(i);
}
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
li.get(i);
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
十二、Set
1.Set接口的两个实现类 HashSet TreeSet
2.特点:
A.元素不能重复
B.无序 没有顺序
C.没有索引
package com.qf.demo08;
import java.util.HashSet;
import java.util.Set;
public class Test01 {
public static void main(String[] args) {
//实例化集合
Set s = new HashSet();
s.add("李四");
s.add("王五");
s.add("赵六");
s.add("刘清");
s.add("吴");
s.add("a");
s.add("吴");
System.out.println(s);
}
}
注意add增加相同元素时,集合不会再增加此相同元素
集合遍历总结
list集合及其子类arraylist,linklist,四种方式都可以
set,map及其子类hashset,treeset,hashmap,hashlinkedmap,只能增强for循环,转换为迭代器两种方式,转换数组一般不用