Java基础14 集合(重要)四种遍历方式 list 并发异常 set

一、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循环,转换为迭代器两种方式,转换数组一般不用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值