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);
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;
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/69e620ba506bfa40d253fae8a1d93de3.png)
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 (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);
}
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3b4a2c1d52969e53f1bfe316ec2c5b01.png)
并发修改异常
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);
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c727c436d5a505f39ca8172c4373c39c.png)
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 (int i = 0; i < list.size(); i++) {
String s = list.get(i);
if ("world".equals(s)) {
list.add("javaee");
}
}
System.out.println(list);
}
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/02eb504c3bc91db5a55c4a6807c1ec83.png)