java集合

java集合框架及其功能

集合的由来:
	由于Java是一门面向对象的语言,数组远远不能够达到对对象操作的需求,所以为了方便对多个对象的操作,java就提供了集合类。
数组和集合的区别:
	1.长度区别:数组的长度是固定的而集合的长度是可变的
	2.储存数据类型的区别:数组可以储存基本数据类型,也可以储存引用数据类型;而集合只能存储引用数据类型
	3.内容区别:数组只能存储同种数据类型的元素,集合可以存储不同类型的元素
集合的继承体系:
Collection是集合的顶级接口,他有两个常用的子接口List接口和Set接口
List接口下面有三个常用的实现类:ArrayList
					  	   LinkedList
					  	   Vector
Set接口下面有三个常用的实现类:HashSet
					      LinkedHashSet
					      TreeSet
Collection接口的功能
1.添加功能:
boolean add(Object obj); 添加一个元素
boolean add(Collection c); 添加一个集合的元素(给一个集合添加另一个集合中的所有元素)
2.删除功能:
void clear();  移除所有元素
boolean remove(Object obj); 移除一个元素
boolean removeAll(Collection c); 移除一个集合的元素(移除一个以上的就返回true)删除的元素是两个集合的交集元素,如果没有交集元素则删除失败,返回false
3.判断功能:
boolean contains(Object obj); 判断集合中是否包含指定的元素
boolean containsAll(Collection c); 判断集合中是否有包含指定的集合元素(这个集合中包含另一个集合中的所有元素才算包含 返回true)
boolean isEmpty(); 判断集合是否为空
4.获取功能
Iterator<E> iterator()迭代器接口
源码中迭代器是内部类,内部类可以直接访问外部类的成员
// private class Itr implements Iterator<E>
方法:boolean hasNext();   如果仍有元素可以迭代,则返回true
E next();   返回迭代的下一个元素
void remove();  从迭代器指向的集合中移除迭代器返回的最后一个元素
a.长度功能:
	int size();元素的个数
b.交集功能;
	boolean retainAll(Collection c); 获取两个集合的交集元素
	eg:A集合对B集合取交集,获取到的交集元素在A集合中。返回的布尔值表示的是A集合是否发生变化
		A集合对B集合取交集元素,如果没有取到交集元素A集合会被清空
c.将集合转换成数组
	Object[] toArray();
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class MyTest {
    public static void main(String[] args) {
        Student student1 = new Student("张三", 23);
        Student student2 = new Student("李四", 24);
        Student student3 = new Student("王五", 22);
        Collection<Student> list = new ArrayList<>(); //用实现子类来实例化接口
        list.add(student1);   //将student1添加到list集合中
        list.add(student2);
        list.add(student3);
        Iterator<Student> iterator = list.iterator();   //使用迭代器来遍历集合
        while(iterator.hasNext()) {    
            Student student = iterator.next();
            System.out.println(student);   //将集合中的元素打印出来
        }
    }
}
class Student {
    public String name;
    public int age;
    public Student() {
    }
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return this.name+"===="+this.age;
    }
}

在这里插入图片描述

List集合
List集合特点:元素有序,并且每一个元素都存在一个索引,元素可以重复
List集合的特有功能:
void add(int index,E element); 在指定索引处添加元素
E remove(int index); 移除指定索引处的元素 返回的是移除的元素
E get(int index); 获取指定索引处的元素
E set(int index,E element);  更改指定索引处的元素 返回的而是被替换的元素
int indexOf(Object o);   返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1
从前往后找
int lastIndexOf(Object o); 返回此列表中最后出现的指定元素的索引,如果此列表不包含该元素,则返回-1
从后往前找
List集合也有自己的迭代器ListIterator
ListIterator继承自Iterator,可以使用Iterator中的方法
ListIterator特有的功能:
boolean hasPrevious();  是否存在前一个元素
E previous();  返回列表中的前一个元素
以上两个方法可以实现反向遍历 但是注意要完成反向遍历之前 要先进行正向遍历 这样指针才能移到最后;直接反向遍历是没有效果的,因为指针默认位置就在最前面他前面没有元素
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class MyTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(100);
        list.add(500);
        list.add(200);
        list.add(50);
        //可以用自身的方法for循环迭代
        for (int i = 0; i < list.size(); i++) {
            Integer integer = list.get(i);
            System.out.println(integer);
        }
        System.out.println("=================");
        ListIterator<Integer> listIterator = list.listIterator();
        //正向迭代
        while (listIterator.hasNext()) {
            Integer integer = listIterator.next();
            System.out.println(integer);
        }
        //反向迭代
        System.out.println("==================");
        while (listIterator.hasPrevious()) {
            Integer previous = listIterator.previous();
            System.out.println(previous);
        }
    }
}

在这里插入图片描述

并发修改异常
ConcurrentModificationException 并发修改异常
当我们有一个需求:我有一个集合,想判断集合中里面是否有"world"这个元素,如果有,我就添加一个"javaee"元素。
这时如果用迭代器迭代集合中的元素,并在迭代途中,要想增删集合中的元素,就会发生这个异常
原因:迭代器,迭代之前,已经预先知道了集合中的元素的长度,那么他就会按照集合原来的长度进行迭代,你突然在迭代的途中,增删元素,会改变原有集合的长度,造成迭代器之前的长度和集合改变后的长度不一致,迭代器就会抛出这个异常
解决方法:1.你可以使用迭代器自带的增删方法
		2.你可以使用for循环来遍历集合,然后在遍历途中进行元素的增删
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class MyTest2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("php");
        list.add("javascript");
        list.add("c++");
        list.add("world");
        ListIterator<String> listIterator = list.listIterator();
        //迭代器遍历集合用集合自带的增删方法
        while (listIterator.hasNext()) {
            String s = listIterator.next();
            if ("world".equals(s)) {
                list.add("javaee");      
            }
        }
        System.out.println(list);
    }
}

在这里插入图片描述

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
public class MyTest2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("php");
        list.add("javascript");
        list.add("c++");
        list.add("world");
        //方式一:用迭代器自身的增删方法
        ListIterator<String> listIterator = list.listIterator();
        while (listIterator.hasNext()) {
            String s = listIterator.next();
            if ("world".equals(s)) {
                listIterator.add("javaee");
            }
        }
        System.out.println(list);
        //方式二:用for来遍历集合
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if ("world".equals(s)) {
                list.add("javaee");
            }
        }
        System.out.println(list);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值