集合框架
概念:
1.Collection是所有集合的顶级接口
2.集合和数组一样,可以保存一组元素,并且提供了操作元素的相关方法,使用更方便
3.Collection 下面有多种实现类,因此我们有更多的数据结构可以选择
Collection 的方法 1(单个集合)
通过向上造型,创建了一个集合 “c”,此处以实现类ArrayList为例
此时输出集合"c"
输出结果是一个空集合
1.boolean add(E e)
向当前集合的末尾添加一个元素,成功添加返回true,否则返回false
当调用add()方法向集合中添加元素时,结果为ture,再次输出集合时,原本为空的集合中有了内容"abc"
2.int size()
返回当前集合的元素个数
当调用size()方法并打印时,可以得到集合的大小
3.boolean isEmpty()
判断当前集合是否为空,为空时返回ture,反之返回false
此时集合中一个元素’abc’所以集合不为空
4. void clear()
清空当前集合
当调用clear()方法时会清空当前集合,不需要接收,此时再次输出集合是否为空时,输出结果变为ture
5. boolean contains(Object o)
判断当前集合中是否包含给定元素,判断依据是看给定元素是否存在与集合元算equals比较结果为true的情况,存在则认为包含
6.boolean remove(Object o)
从集合中删除给定的元素,也是删除与集合中equals比较为true的元素,如果集合中存在多个重复元素,仅删除第一个
调用remove()方法,如果删除成功返回ture,反之则返回false,此时集合中只有一个"abc"元素,所以第一次调用时返回ture,第二次返回false
Collection 的方法 2 (集合间)
此时准备了两个集合并在其中添加元素
7.boolean addAll(Collection<?extends E>c)
将给定集合中的所有元素添加到当前集合中,当前集合 发生了改变返回true
1.此时先输出一次集合c,查看了集合c中原有的元素.
2.使用集合c 对象 调用 addAll()方法,将集合c2添加到集合c 中,打印结果为ture,说明添加成功.
3.再次打印集合c.可以发现集合c中涵盖了集合c2与c的所有元素
8. boolean containsAll(Collection<?> c)
判断当前集合是否包含给定集合中的所有元素
此时集合c2中与集合c中有一个元素并不相同,所以输出的结果为false
9.boolean removeAll(Collection<?> c)
删除当前集合中与给定集合的共有元素
删除了集合c与集合c2共有的元素"abc"与"ab"
10.集合与数组的转换
1. 将当前集合转换为一个Object类型的数组
2.将当前集合转换为指定参数类型的数组
将当前集合转换为指定参数类型的数组,该方法要求传入一个数组.
如果该数组可用(数组长度>=集合的size)时,会将当前集合元素直接存入到该数组中,然后将数组返回,
如果数组不可用,会创建一个与参数数组同类型并且长度与集合size一致的数组,再将元素存入到数组后返回.
Collections工具类提供的方法
1.加锁
我们常用的集合实现类:ArrayList,LinkedList,HashSet都是线程不安全的,因此多线程情况下不应当操作他们.
集合的工具类:java.util.Collections 提供了一组静态方法,可以将现有的集合转化为一个并发安全的集合
变成线程并发安全的集合,有返回值 并用原集合接收
2.翻转
提供了一个方法用于翻转List集合的元素
***注意:***只能用于list集合
集合的遍历
iterator 迭代器
Collection 提供了一个方法 :Iterator iterator()
迭代器接口中规定了遍历集合元素所需要的相关方法,使用迭代器遍历需要遵循的原则为:问,取,删,其中删除元素不会遍历过程中的必要操作.
问 boolean hasNext()
判断集合中是否还有元素可以迭代,有返回true,没有返回false
这里通过集合c的对象调用iterator()方法,返回了一个迭代器并接收,通过迭代器i调用hasNext()方法,作为循环条件,当有下一个元素时继续遍历,没有下一个元素时,循环终止,通过"问",对集合进行遍历
取 E next()
获取集合下一个元素(第一次调用时是获取下一个元素,以此类推)
这里通过迭代器i去调用next()方法,读取集合中的元素,每调用一次获取下一个元素
删 void remove()
用迭代器提供的remove方法,对当前遍历到的元素进行删除
这里"abc"被删除掉了
注意:
当使用迭代器对集合进行遍历时,使用集合提供的remove()方法会出现报错
新循环
1.JDK5之后推出了一个特性:增强型for循环,也称为新循环,使得我们可以使用相同的语法遍历集合或数组
2. 新循环也是语法糖,编译器在编译源代码时如果发现使用新循环遍历数组,会将代码改为普通的for循环进行.
***注意:***使用新循环遍历集合会被编译器改为迭代器遍历.因此,使用新循环遍历的过程中,仍然不能通过集合的方法增删元素
语法: for(元素类型 元素名:集合或数组){ 循环体 }
lambda表达式
JDK8 之后,集合提供了一个新方法 可以使用lambda表达式遍历集合元素,运行时讲集合的每个元素都顺序传递给lambda表达式中的变量,并执行一次表达式.方法内部是使用新循环实现的
泛型
1.泛型也称为参数化类型,允许我们在使用一个类或接口时,通过其定义的泛型来指定其属性,方法的参数或返回值的类型等
2.泛型的类型必须是引用类型,有泛型支持的类或接口在使用时若不确定具体的泛型类型,则默认为原型的Object
3.迭代器接口也支持泛型
泛型属于语法糖,编译器在编译时会根据泛型指定的类型补全造型的代码
Collecion 的两个常见接口
1.java.util.List
List继承自Collection,是集合中常用的一个子类型
特点:可以存放重复元素 且有序,并提供了一套通过下标操作元素的方法
(重复元素的判定是依靠元素自身的equals方法比较的结果而定,为true就认为是重复元素.)
List 提供的方法
1.void add(int index,E element)
将元素添加到指定下标,后续元素相继后移.
2.E remove(int index)
将指定下标元素删除,返回删除掉的元素
3. E get(int index)
获取指定下标的元素并返回
4.E set(int index,E element)
将给定元素设置到指定位置,并返回原有元素
将数组转换为集合
List asList(T… a)
数组工具类 Arrays 提供了一个静态方法 可以将一个数组转换为一个List集合
此处准备了一个数组array,通过调用asList()方法将数组转换并用一个集合接收
***注意:***通过数组转换而来的集合,对该集合的操作就是对源数组的操作(我认为是因为集合没有通过new去开辟新空间,而是通过赋值的方式得到了数组的对象)
由于数组是定长的,因此从数组转换而来的集合不可以调用增删元素等会影响数组长度的操作,否则会抛出异常
如果向向集合中增删元素,需要自行创建一个集合,然后将原集合的元素导入到该集合中即可.
所有的集合都支持一个参数类型为Collection的构造方法,作用是在创建当前集合的同时包含给定集合中的所有元素
List常见的实现类:
1.java.util.ArrayList
内部使用数组实现,查询性能更好
2.2.java.util.LinkedList
内部使用链表实现,增删元素性能更好,首尾增删元素性能最佳
2.2.java.util.Set
1.不可以保存重复元素
Set 常见的实现类:
1.java.util.HashSet