优点:底层数据结构是数组,查询快,增删慢
缺点:线程不安全,效率高
优点:底层数据结构是数组,查询快,增删慢
缺点:线程安全,效率低
优点:底层数据结构是链表,查询慢,增删快
缺点:线程不安全,效率高
底层数据结构是哈希表,无序,唯一
如何保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
底层数据结构是链表和哈希表。FIFO插入有序,唯一
1.由链表保证元素有序
2.由哈希表保证元素唯一
底层数据结构是红黑树。唯一,有序
1.如何保证元素排序?
自然排序比较器排序
2.如何保证元素唯一性?
根据比较的返回值是否为0来决定
1.HashMap的底层数据结构
2数组:查找容易,通过index快速定位;插入和删除困难,需要移动插入和删除位置之后的节点;
链表:查找困难,需要从头节点或尾结点开始遍历,直到寻找到目标节点;插入和删除容易,只需修改目标节点前后节点的next或prev属性即可;
HashMap巧妙的将数组和链表结合在一起,发挥两者各自的优势,使用一种叫“拉链法”的方式来解决哈希冲突。
首先通过index快速定位到索引位置,这边利用了数组的优点;然后遍历链表找到节点,进行节点的新增/修改/删除操作,这边利用了链表的优点。
LinkedHashMap和TreeMap都是提供了排序支持的Map,区别在于支持的排序方式不同:
LinkedHashMap:保存了数据的插入排序,也可以通过参数设置,保存数据的访问顺序
TreeMap:底层是红黑树实现,可以指定比较器(Comparator比较器),通过重写compare方法来自定义排序;如果没有指定比较器,TreeMap默认是按key的升序排序(如果key没有实现Comparable接口,则会抛异常)。
HashMap允许key和value为null,Hashtable不允许。
HashMap的默认初始容量为16,Hashtable为11.
HashMap的扩容为原来的2倍,Hashtable的扩容为原来的2倍加1
HashMap是非线程安全的,Hashtable是线程安全的,使用synchronized修饰方法实现线程安全。
HashMap的hash值重新计算过,Hashtable直接使用hashcode
HashMap去掉了Hashtable中的contains方法
HashMap继承自AbstractMap类,Hashtable继承自Dictionary类。
HashMap的性能比Hashtable高,因为Hashtable使用synchronized实现线程安全
Vector和ArrayList的实现几乎是一样的,区别在于:
1)最重要的区别:Vector在方法上使用了synchronized来保证线程安全,同时由于这个原因,在性能上ArrayList会有更好的表现。
2)Vector扩容后容量默认变为原来2倍,而ArrayList为原来的1.5倍。
有类似关系还有:StringBuilder和StringBuffer,HashMap和Hashtable。
1.ArrayList底层基于动态数组实现,LinkedList底层基于双向链表实现。
2.对于随机访问(按index访问,get/set方法):ArrayList通过index直接定位到数组对应位置的节点,而LinkedList需要从头结点或尾结点开始遍历,直到寻找到目标节点,因此在效率上ArrayList优于ArrayList。
3.对于随机插入和删除:ArrayList需要移动目标节点后面的节点,而LinkedList只需要修改目标节点前后节点的next或prev属性即可,因此在效率上LinkedList由于ArrayList。
4.对于顺序插入和删除:由于ArrayList不需要移动目标节点后面的节点,因此在效率上比LinkedList更好。
5.两者都不是线程安全的
6.内存空间占用:ArrayList的空间浪费主要体现在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在他的每一个元素都需要消耗比ArrayList更多的空间。
Collection:集合类的一个顶级接口,提供了对集合对象进行基本操作的通用方法。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,常见的List与Set就是直接继承Collection接口。
Collection:集合类的一个工具类/帮助类,提供了一系列静态方法,用于对集合中元素进行排序,搜索以及线程安全等各种操作