谁的子类/接口 ——>描述数据结构 ——> 底层结构 ——>初始/扩容 ——> 有序/允许重复/允许null ——> 线程安全
目的:临时存储数据
集合类的三个角度:
- 使用角度:数据容器:(希望比较/快速的进行增删改查)
- 底层引入了组织方式:数据结构,容器内部的数据按照哪种结构组织(高效/快速)
- 落实到代码上:怎么表示数据结构的 用什么对象关系(具体的在内存上实际存在的)描述这种数据结构:数组或者链表
面试重点:ArrayList和HashMap
se面试常用点:String、多线程、垃圾回收、集合类、网络编程、I/O流
Collection
单列集合
- Collection是Collection集合体系的顶级接口
- Collection的一些子实现是有序的,另一些子实现是无序的
- Collection的一些子实现允许存储重复元素,另一些子实现不允许存储重复元素
- Collection的一些子实现允许存储null(例如:ArrayList),另一些子实现不允许存储null(例如:TreeSet)
这里要记住JDK不提供此接口的任何直接实现:它提供更具体的子接口,如Set、List实现
Collection的方法:
boolean | add(E e) 确保此 collection 包含指定的元素(可选操作)。 | |
boolean | addAll(Collection<? extends E> c) 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。 | |
void | clear() 移除此 collection 中的所有元素(可选操作)。 | |
boolean | contains(Object o) 如果此 collection 包含指定的元素,则返回 true。 | |
boolean | containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true。 | |
boolean | equals(Object o) 比较此 collection 与指定对象是否相等。 | |
int | hashCode() 返回此 collection 的哈希码值。 | |
boolean | isEmpty() 如果此 collection 不包含元素,则返回 true。 | |
Iterator<E> | iterator() 返回在此 collection 的元素上进行迭代的迭代器。 | |
boolean | remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 | |
boolean | removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。 | |
boolean | retainAll(Collection<?> c) 仅保留此 collection 中那些也包含在指定 collection 的元素(可选操作)。 | |
int | size() 返回此 collection 中的元素数。 | |
Object[] | toArray() 返回包含此 collection 中所有元素的数组。 | |
| toArray(T[] a) 返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
最后一个泛型是需要加深理解,面试有可能会问,但是日常开发不会用到。
Iterator每个底层的实现方式都不一样
并发修改异常——Foreach
情景:如果这个线程在遍历集合,而另一线程在删除。
解决办法:
加锁(不可行)——颗粒度太细
jdk使用的方法是使用这个modCount的并发,但是没有加锁完美,会导致单线程出现问题
Itreator中的next指向的是两个元素之间
Foreach循环——除了数组,其他底层都是Iterator遍历的
List子接口——接口作用:定义规范
- List是Collection接口的子接口
- 描述的是线性表这种数据结构(线性表:有序序列-有下标/有下标api)
- 必定有序
- 允许存储重复元素
- 允许存储null
List接口
boolean | add(E e) 向列表的尾部添加指定的元素(可选操作)。 | |
void | add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。 | |
boolean | addAll(Collection<? extends E> c) 添加指定 collection 中的所有元素到此列表的结尾,顺序是指定 collection 的迭代器返回这些元素的顺序(可选操作)。 | |
boolean | addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。 | |
void | clear() 从列表中移除所有元素(可选操作)。 | |
boolean | contains(Object o) 如果列表包含指定的元素,则返回 true。 | |
boolean | containsAll(Collection<?> c) 如果列表包含指定 collection 的所有元素,则返回 true。 | |
boolean | equals(Object o) 比较指定的对象与列表是否相等。 | |
E | get(int index) 返回列表中指定位置的元素。 | |
int | hashCode() 返回列表的哈希码值。 | |
int | indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。 | |
boolean | isEmpty() 如果列表不包含元素,则返回 true。 | |
Iterator<E> | iterator() 返回按适当顺序在列表的元素上进行迭代的迭代器。 | |
int | lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。 | |
ListIterator<E> | listIterator() 返回此列表元素的列表迭代器(按适当顺序)。 | |
ListIterator<E> | listIterator(int index) 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。 | |
E | remove(int index) 移除列表中指定位置的元素(可选操作)。 | |
boolean | remove(Object o) 从此列表中移除第一次出现的指定元素(如果存在)(可选操作)。 | |
boolean | removeAll(Collection<?> c) 从列表中移除指定 collection 中包含的其所有元素(可选操作)。 | |
boolean | retainAll(Collection<?> c) 仅在列表中保留指定 collection 中所包含的元素(可选操作)。 | |
E | set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。 | |
int | size() 返回列表中的元素数。 | |
List<E> | subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。 | |
Object[] | toArray() 返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。 | |
| toArray(T[] a) 返回按适当顺序(从第一个元素到最后一个元素)包含列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。 |
subList
是一个视图方法,是一个切割方法,并没有真正的切割出数据,仅仅是维护了原数据的一些标记,标记哪些元素是切割出来的范围。看上去好像是复制了一根数据,实际上并没有。他里面的数据还是源数据。
视图、数据库、“虚表”,给原本的数据划分不同的表,不同的表持有不同的数据引用
iterator迭代器
remove只能删除刚刚遍历过的元素
iterator这些操作只是维护了标记。
iterator的子接口ListIterator
修改、添加、向前遍历
add是添加到要遍历的位置--->连续添加
set是修改刚刚遍历过的元素位置-->连续修改
ArrayList
特点:
clone方法:只拷贝两层,第一层是ArrayList对象,第二层是ArrayList所持有的数组
Vector
- 是List接口的一个子实现JDK1.0之后
- 描述的数据结构是线性表
- 底层结构是数组
- 默认的初始长度,数组扩容机制
- 有序
- 允许重复
- 允许存储null
- 是线程安全的
stack
- 是Vector的一个子类,复用Vector的底层结构,参数 变量以及方法
- 描述的数据结构是栈
- 底层结构是数组
- 默认初始容量是10,默认扩容机制是2倍
- 有序,允许重复 可以null
- 线程安全
如果使用Stack的时候尽量不要使用从Vector继承来的方法,因为既然使用了stack那么你就希望它作为栈而存储,而非普通线性表。
如果真的需要一个栈,可以优先使用Deque接口下的具体实现,因为Deque这个接口定义了栈的数据结构操作。
LinkedList
- 是List一个具体实现(同时它还实现了Deque接口)
- 描述的数据结构是:线性表、队列、双端队列、栈
- 底层结构是双向链表
- 有序
- 允许存储重复元素
- 允许存储null
- 线程不安全
clone方法
Deque
这个接口描述的数据结构:队列,双端队列,栈
Map-键值对(自我描述)
双列集合——键值对