这篇文章记录了Collection集合,List集合,Set集合
在文章第七点总结了两大系列集合的五种实现类的区别,有需要的小伙伴可以直接去查看
一、什么是集合
集合是Java中存储对象数据的一种容器
二、集合有什么特点
- 大小不固定,类型也可以不固定(通常需要泛型约束)
- 集合只能存储引用数据类型
- 集合适合对容器中的元素进行增删操作
三、体系结构
Collection单列集合,每个元素(数据)只包含一个值。
Map双列集合,每个元素包含两个值(键值对)。
四、Collection
1. 什么是Collection
官方的解释:
- Collection是集合层次结构中的根接口。 集合表示一组对象,称为其元素 。 有些集合允许重复元素而其他集合则不允许。 有些是有序的,有些是无序的。
- JDK不提供此接口(Collection)的任何直接实现:它提供了更具体的子接口的实现,如 Set 和 List
- 此接口通常用于传递集合并在需要最大通用性的情况下对其进行操作。
说的通俗一点就是:
- Collection是根接口,所有集合都来自Collection
- jdk不提供该接口实现类对象,但提供了更具体的实现类
- 就好比父类和子类,你可以用父类对象接收一个子类的实例化对象
???例如:Father f = new Sun(); // Sun类继承了Father类
2. Collection的体系结构
3. 常用方法
方法名称 |
说明 |
|
把给定的对象添加到当前集合中 |
|
清空集合中所有的元素 |
|
把给定的对象在当前集合中出现的第一个位置删除,如果删除失败返回false |
|
判断当前集合中是否包含给定的对象 |
|
判断当前集合是否为空 |
|
返回集合中元素的个数。 |
|
把集合中的元素,存储到数组中 |
4. 集合的遍历方式
4.1 迭代器
Iterator是单列集合专用的迭代方法,只能集合调用
Iterator中常用方法
- next():返回迭代中的下一个元素
- hasNext():如果迭代具有更多元素,则返回true
Collection<Integer> list = new ArrayList<>();
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
Integer next = iterator.next();
System.out.println(next);
}
注意事项:
- 迭代器只能使用一次
- next()移动指针到下一个元素,如果没有抛异常
- hasNext()检查下一个元素是否为空,但不移动指针
- 迭代器迭代元素越界出现:NoSuchElementException
4.2 普通for
只适用于List系列集合,因为他有序
通过调用集合的get方法,根据索引取值
4.3 增强for
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
//增强for
for (int i : list) {
if (i == 3) {
i = 5;//增强for中如果对取出的这个元素修改,将不会对集合产生影响
}
System.out.println(i);
}
4.4 Lambda迭代
// 使用lambda表达式集合的迭代
colStr.forEach(new Consumer() {
@Override public void accept(String s) {
System.out.println(s);
}
});
// 简化写法
System.out.println("-------------------------");
colStr.forEach(s-> System.out.println(s));
System.out.println("-------------------------");
// 再次简化
colStr.forEach(System.out::println);
五、List
Collection的子接口
1. 特点
有序,有索引(是独有的),可重复,可存储null值,此实现不同步,线程不安全
存储和取出顺序一致
2. 特有方法
方法名称 |
说明 |
注意 |
|
将给定的元素插入到指定位置 |
索引不能越界,否则报错
|
|
返回该索引位置的元素,没找到返回-1 |
|
|
对给定位置的元素进行替换 |
|
|
删除指定位置的元素 |
|
|
返回特定元素在集合中最后一次出现的位置 |
没找到返回-1 |
|
返回特定元素在集合中第一次出现的位置 |
|
|
List集合特有的迭代器 |
|
|
根据开始索引和结束索引(左闭右开)返回一个新的集合,该集合是原集合的子集 |
|
ListIterator叫做列表迭代器,将在第3.2解释
3. 迭代方式
和Collection一样的:迭代器、增强for、Lambda表达式
List独有的:listIterator、普通for(因为有索引)
3.1 并发修改异常
迭代器在迭代集合,但是集合本身被修改,换而言之:就是在同一时刻只能有一个对象来操作集合,否则就会出现并发修改异常
下面两种情况会出现并发修改异常
??1. 迭代器和集合方法都会对集合进行操作
List<String> list = new ArrayList<>();
list.add("java");
list.add("css");
list.add("python");
while(stringListIterator.hasNext()){
String ele = stringListIterator.next();
if("css".equals(ele)){
stringListIterator.remove();//允许
//list.remove("css");// 不允许 出现 ConcurrentModificationException
}
System.out.println(ele);
}
??2. 增强for本身也