容器的比较

一、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值来进行存储数据,有自动的排序功能

Github连接

1、内容比较
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值