容器的比较
一、List的比较
1、ArrayList:
1、 底层实现是通过定义一个 Object[] 的数组的方式,来进行创建 一个数组,同时具备了数组的特性:
2、无法改变大小,无法去修改
3、所有的数据都在同一连续的区域内,方便与查找
4、当数组容量满的时候,就会将数组扩充为原来的1.5倍(利用位运算,左移动一位加上元拉里的大小,刚好1.5倍),底层利用了copy的方法(System.arraycopy())将两个数组进行copy,这就使得我们的数组得到扩充
2、LinkedList:
**1、**底层实现是通过定义一个链式表的模式(设置一个first和一个last对象,能够连接开头和结尾),每个节点有一个previous和next这连个对象,进行跳转,中间的为数据部分,添加的话可以直接让next的指向你新建的数据,每个都可以这样往复,形成像链子一样的结构。
**2、**当修改数据的时候,只需要将他们的previous和next的指向修改一下就可以完成修改,而不需要向ArrayList那样进行复制,效率较低。
**3、**但是他的每个数据都不是集中在一起的,所以他的查询效率较低(相对于Arraylist)。
3、Vector:
底层的架构和ArrayList差不多,但是他相对于ArrayList加入了synchronized的关键字,这就使得了他的线程较为安全,但是他的效率也更为低下。
二、Map的比较
1、HashMap和HashTable
数组+链表的结构
数组:查询速度快 占用空间连续
链表:删除和修改较为快速 占用空间不连续 但是这个链表只是带有next的值的链表
Hash码:每个数据产生的时候都会有一个Hash码,为了找到Hash值设定
Hash算法:是将Hash码均匀的氛围0~ 15个数值之间,使他们的散列分布更加均匀;0~15之间是因 为 开始的时候如果不选择数组的大小的话会设置为默认的16个,(一般情况下都是取余和位运算来)
Hash值:是经过hash算法的到的值,可以决定存储的位置
HashMap生成的时候,就会随机产生HashCode码,然后将哈希码进行散列的算法,可以的得到一个Hash值,这样之后,就会确定这个put到数组的哪个位置,如果有相同的Hash值得话,就会,将他们放在了对应的存在值的后面(相当于链表的next位置),这样就形成了一个小型的链表,但是如果当他们超过一定数量的时候就会产生边的很慢,所以JDK8以后将他们超过8和后的链表转化为红黑二叉树,进行存储,大大的加快了存储的效率
(1)HashTable:
线程不安全,但是效率高 允许key value 为null
(2)HashMap:
线程安全,但是效率不高(添加了synchronized关键字) 不允许key value 为null
2、TreeMap
和HashMap使用和底层原理差不多
但是他使用了Compareable接口(进行排序),降低了效率
一般情况下ThreeMap的使用是在需要排序的时候才会使用,并且ThreeMap是效率比较低的
三、Set
Set这个部分的实现代码是通过Map的key键来进行实现的,所以都是不可重复的;并且调用Map实现的时候他的Value至的地方存储的是一个Object的对象(源代码中让别人定义为常量)
1、HashSet
底层是调用HashMap的对象实现的,且通过key值来进行存储,所以不可重复
2、TreeSet
底层调用了TreeMap的方法来进行实现,且通过key值来进行存储数据,有自动的排序功能
四、简介
三个数组:
arrayList 查询速度快 放在了同一区域
linkList 增删改的速度较快 左右进行连接,房子按了不同的地方
Vector 线程安全 加入了sysnc****的关键字
map{字典}
HashMap link+arraylit 的结合
HashTable synchronized 效率低,但是比较的安全,超过0.75的时候会扩容
TreeMap 自动的排序,使用用了comparable的接口,来进行排序
set 不可重复的数组
HashSet 底层是调用HashMap的对象实现的,且通过key值来进行存储,所以不可重复
TreeSet 底层调用了TreeMap的方法来进行实现,且通过key值来进行存储数据,有自动的排序功能