一、集合的分类
1、单列集合
一次添加一个元素,实现了 Collection 接口
(1)List 接口的实现类
存取有序、有索引、可以存储重复的
(2)Set 接口的实现类
存取无序、没有索引、不可以存储重复的
2、双列集合
一次添加一对元素,实现了 Map 接口
二、Collection 接口的使用
Tips:remove 和 contains 方法依赖 E 类的 equals 方法
如果集合里装的是自定义类的对象,注意是否重写了 equals 方法
三、集合的通用遍历方式
1、迭代器遍历
Collection<Student> stu = new ArrayList<Student>();
stu.add(new Student("aaa",21));
stu.add(new Student("bbb",22));
stu.add(new Student("ccc",23));
// 获取迭代器对象
Iterator<Student> it = stu.iterator();
// 进行遍历
while (it.hasNext()) {
System.out.println(it.next());
}
Tips:next 方法会将元素取出,并将指针后移一位
2、增强for循环(JDK5)
for (Student s : stu) {
System.out.println(s);
}
增强for循环的底层也是迭代器
3、forEach 方法
// 匿名内部类
stu.forEach(new Consumer<Student>() {
@Override
public void accept(Student student) {
System.out.println(student);
}
});
// Lambda 表达式
stu.forEach(student -> System.out.println(student));
forEach方法的底层也是迭代器
四、List 接口
1、特点
存取有序、有索引、可以存储重复的
2、和索引相关的方法
如果存储类型是整数,如果想传入元素进行 remove,需要手动装箱
List 还可以用普通for循环或者ListIterator(List特有的迭代器)进行遍历
3、并发修改异常
ConcurrentModificationException
使用迭代器遍历集合的过程中,调用了集合对象添加或删除方法,就会出现此异常
解决方法:调用迭代器的添加或删除方法
普通的迭代器有删除方法但没有添加方法
List特有的迭代器有添加方法
五、ArrayList 类
ArrayList 底层是数组,查询相对快,增删相对慢
如果初始添加了元素,那么初始长度为10
如果初始没有添加元素,那么初始长度为0
当数组满了之后,自动扩容为1.5倍
六、LinkedList 类
LinkedList 底层是双向链表,增删相对快,查询相对慢
增删首尾元素非常快
LinkedList 也有 get 方法,表面看起来是根据索引获取值
其底层会判断离头部近还是离尾部近,然后一个个找