一、List
1.List-ListIterator 的常用方法
2. 并发异常-ConcurrentModificationException
产生异常的原因:
使用迭代器遍历的时候使用了集合的方法添加数据,集合修改数据后,迭代器并不知道集合修改了数据,所以就会发生并发异常
解决:
A.使用迭代器遍历时,使用迭代器进行修改数据
B.使用普通循环进行遍历,然后使用集合的方法修改数据
代码:
package com.qf.test.test01;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Test02 {
public static void main(String[] args) {
//实例化集合
List li = new ArrayList();
//给集合赋值
li.add("阿陆");
li.add("阿甘");
li.add("黑福");
/*//错误代码 会发生 并发异常
//将集合转换为迭代器
Iterator ii = li.iterator();
//使用循环遍历
while (ii.hasNext()){
String s = (String) ii.next();
if (s.equals("阿甘")){
li.add("阿文");
}
}
System.out.println(li);*/
//解决方法 1 使用迭代器进行添加
//将集合转换为List专属迭代器
/* ListIterator itre = li.listIterator();
//循环遍历
while (itre.hasNext()){
String s = (String) itre.next();
if (s.equals("阿甘")){
itre.add("阿文");
}
}
System.out.println(li);
System.out.println("++++++++++++++++++++++++++++++++++++++++++++");*/
//解决方法 2 使用普通for循环 用集合方法进行添加
for (int i=0;i<li.size();i++){
if (li.get(i).equals("阿甘")){
li.add("阿文");
}
}
System.out.println(li);
}
}
二、ArrayList
1.简介
ArrayList是List接口的实现类
2.特点:
ArrayList底层结构是数组的数据结构,初始化容量为10,该数据结构的特点为:查询快,增删慢。
ArrayList在多线程中是不同步的,所以在多线程中不安全
三、数据结构
1.数组结构
特点:查询快,增删慢。
2.栈结构
特点:先进后出
3.队列
特点:先进先出
4.链表
特点:查询慢,增删快。
四、案例
需求:
分析:
代码:
//工人类
package com.qf.test.test02;
public class Worker {
//定义私有属性
private String name;
private int age;
private double money;
public Worker() {
}
public Worker(String name, int age, double money) {
this.name = name;
this.age = age;
this.money = money;
}
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;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Worker{" +
"name='" + name + '\'' +
", age=" + age +
", money=" + money +
'}';
}
}
//测试类
package com.qf.test.test02;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//实例化集合
List li = new ArrayList();
//将工人对象存入集合中
li.add(new Worker("阿陆",20,3000));
li.add(new Worker("阿甘",20,4000));
li.add(new Worker("胡歌",20,6000));
li.add(new Worker("大胡",20,5500));
li.add(new Worker("黑福",20,2500));
li.add(new Worker("小胡",20,3500));
//循环遍历集合打印工人信息
for (int i=0;i<li.size();i++){
System.out.println(li.get(i));
}
System.out.println("===================================");
//定义一个变量记录总数
double sum = 0;
//使用循环遍历集合
for (int i=0;i<li.size();i++){
Worker w = (Worker) li.get(i);
sum += w.getMoney();
}
//输出平均工资
System.out.println((int)(sum/li.size()));
System.out.println("===================================");
//打印名字中包含胡的
for (int i=0;i<li.size();i++){
Worker w = (Worker) li.get(i);
if (w.getName().contains("胡")){
System.out.println(w);
}
}
System.out.println("===================================");
//打印姓胡的
for (int i=0;i<li.size();i++){
Worker w = (Worker) li.get(i);
if (w.getName().substring(0,1).equals("胡")){
System.out.println(w);
}
}
System.out.println("===================================");
//键盘输入工人名字 判断是否有这个人
//实例化Scanner
Scanner input = new Scanner(System.in);
System.out.println("请输入姓名");
String name = input.next();
//定义一个标记
boolean flag = false;
for (int i=0;i<li.size();i++){
Worker w = (Worker) li.get(i);
if (w.getName().equals(name)){
System.out.println(w);
flag = true;
break;
}
}
if (!flag){
System.out.println("查无此人");
}
System.out.println("===================================");
//键盘录入工资 打印比此工资高的
System.out.println("请输入工资");
double pay = input.nextDouble();
for (int i=0;i<li.size();i++){
Worker w = (Worker) li.get(i);
if (w.getMoney()>pay){
System.out.println(w);
}
}
}
}
五、LinkedList
1.简介
LinkedList是List接口的实现类
LinkedList是以链表的方式进行存储
LinkedList在多线程中是不同步的,所以在多线程中不安全
2.LinkedList独有的方法
六、Set
1.简介
Set集合是一个接口,主要是实现类有HashSet类 TreeSet类
特点:无序、没有索引 、元素不能重复
2.Set集合的遍历方式
1.使用迭代器
2.使用增强for循环
只能使用这两种方式
七、案例
需求:
分析:
代码:
package com.qf.test.test04;
import java.util.HashSet;
import java.util.Set;
public class Test02 {
public static void main(String[] args) {
//实例化集合
Set set = new HashSet();
//使用循环产生随机数并赋值给集合
while (set.size()<10){
int r = (int) (Math.random()*21+20);
set.add(r);
}
System.out.println(set);
}
}