Java集合将接口和实现分离
集合的基本接口是Collection
public interface Collection<E>
{
boolean add(E element);
Iterator<E> iterator();
......
}
Iterator是迭代器
public interface Iterator<E>
{
E next();
boolean hasNext();
void remove();
default void forEachRemaining(Consumer<? super E> action);
}
通过调用next,访问每一个元素,如果访问不到返回异常,所以在调用next之前要使用hasNext进行查询
Java迭代器认为是位于两个元素之间,当调用next时,迭代器越过一个元素,并返回越过的元素
在调用remove之前,要先使用next,越过要删除的元素,否则会抛出异常
集合都继承于Collection和Map接口
Collection:
——List
————LinkedList 链表,方便插入删除,不同步,线程不安全
————ArrayList 数组,方便查找,不同步,线程不安全
————Vector 数组,方便查找,不同步,线程安全
————Stack 继承自vector
——Set
————HashSet 底层为散列表,用哈希算法保证插入值唯一,无序
————LinkedHashSet 加入链表保证插入顺序不变
————TreeSet 有序,底层使用二叉树,内部使用红黑树排序,
——Queue
Map:
——HashMap 不同步,线程不安全,对键进行散列,不对值进行操作
——HashTable 同步,线程安全
——TreeMap 用键的整体顺序对元素排序,底层为二叉树,排序使用红黑树
List与Set区别
1.List中元素是有序的,元素可重复,可根据索引获取元素
2.Set中元素是无序的,元素是唯一的,不能根据索引获取元素
ArrayList与LinkedList异同
ArrayList不同步,线程不安全,底层实现是数组,可用索引直接定位元素,方便查找,不方便进行增删操作
LinkedList不同步,线程不安全,底层实现是链表,不能用索引直接定位元素,可以使用迭代器进行查找,方便增删操作,不方便查找
ArrayList与Vector异同
ArrayList与Vector都是数组实现,方便查找。ArrayList不同步,线程不安全,默认扩张因数为1.5。Vector可同步,线程安全,可自己设置扩张因数。
HashSet具体实现唯一性的比较过程:
存储前使用哈希算法生成一个哈希值
将这个值与已存储的哈希值进行对比
如果没有相同,直接存储到哈希值对应的位置
如果存在相同,调用equals方法,判断内容是否相同,如果相同不存储。
如果内容不相同,采取地址冲突算法解决,在当前哈希值处建立一个新链表存储