day17
集合:新的容器,只用来装对象,不能用来装基本数据类型的数据
集合比数组
(1)类型更丰富,它有各种特征的集合
(2)无需程序员来编写“扩容”等代码,也不用通过"total"来记录实际的元素的个数
分为两大类:
(1)Collection:存储一组对象,单身party
(2)Map:存储“映射关系”的,存储“键值对” (key,value),情侣party,家庭party
Collection:最常用的两个子接口
List:有序(添加的顺序)的可重复的
Set:无序(添加的顺序)的不可重复
java.util.Collection:接口
JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现
1、添加
boolean add(Object obj)
boolean addAll(Collection other):
当前集合 = 当前集合 ∪ other集合
2、删除
boolean remove(Object o)
boolean removeAll(Collection other)
当前集合 = 当前集合 - (当前集合 ∩ other)
void clear()
3、修改(没有提供)
4、查找:
boolean contains(Object o)
boolean containsAll(Collection c)
判断c集合是否是当前集合的子集
boolean isEmpty()
5、获取元素的个数
int size()
6、排序(没有提供)
没有提供的原因,某些集合自带排序功能,而且Collections工具类有排序功能
7、遍历
Iterator<E> iterator() :获取集合自身的迭代器,用于遍历集合用的
Object[] toArray()
8、求两个集合的交集
boolean retainAll(Collection<?> c)
当前集合 = 当前集合 ∩ other
java.util.Iterator接口:
(1)boolean hasNext() :是否有下一个元素需要迭代
(2)Object next() :取出下一个元素
(3)void remove() :删除刚刚迭代的元素
java.util.List:
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。
用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
List是Collection的子接口,那么Collection中的方法它也有。
List增加了Collection接口没有的方法,和索引位置相关的方法:
1、添加
boolean add(Object obj):List系列的,默认添加到最后
boolean addAll(Collection other):List系列的,默认添加到最后
boolean add(int index ,Object obj):在指定位置index处,插入一个元素obj
boolean add(int index, Collection other):在指定位置index处,插入多个元素,other中的多个元素
2、删除
boolean remove(Object o)
boolean removeAll(Collection other)
void clear()
Object remove(int index):删除指定位置index的元素,删除的同时还返回了该元素,如果需要就接收,不需要就不接收。
3、修改(有提供)
Object set(int index, Object element) :替换集合index位置的元为element,返回被替换的旧元素
4、查找:
boolean contains(Object o)
boolean containsAll(Collection c)
判断c集合是否是当前集合的子集
boolean isEmpty()
int indexOf(Object o)
int lastIndexOf(Object o)
Object get(int index)
5、获取元素的个数
int size()
7、遍历
Iterator<E> iterator() :获取集合自身的迭代器,用于遍历集合用的
Object[] toArray()
增加了:
ListIterator<E> listIterator():
ListIterator和Iterator有什么不同?
Iterator只能从前往后遍历,而ListIterator可以从任意位置从前往后,从后往前。
8、截取列表的一部分
List<E> subList(int fromIndex, int toIndex)
java.util.List接口的实现类有:
java.util.ArrayList:动态数组
java.util.Vector:动态数组
java.util.LinkedList:链表
java.util.Stack:栈
ArrayList和Vector:
Vector:是旧版本,线程安全的,扩容机制为原来的2倍,支持旧版的Enumeration迭代器
ArrayList:是新版本,线程不安全的,扩容机制为原来的1.5倍,不支持Enumeration迭代器
ArrayList只用:foreach和Iterator或ListIterator
只看,不改:foreach
看,并且删除:从前往后:Iterator
看,并且删除、插入,从前往后,或从后往前:ListIterator
动态数组与LinkedList区别:底层的物理结构不同:
动态数组底层的实现是数组;
优点:可以根据索引快速的遍历和查找元素
缺点:长度不够,需要扩容,影响性能
删除后,要移动元素,并且空出大量的空间,浪费空间 需要开辟连续的存储空间
LinkedList是链表结构。
优点:有几个元素,占几个空间,不需要连续的空间 添加时,不需要扩容 删除:只要修改前后元素的关系就可以,和其他元素无关,无需移动
缺点:无法索引快速定位,如果要按索引操作,效率比较低,从头遍历