集合对比及hsahmap

主要问题hashmap

最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体

当我们往HashMap中put元素的时候,会先根据key的hashCode值计算出数组中对应的 位置(下标),然后再把这个元素的key,value封装放到对应的位置上。如果这 个元素所在的位置已经存放了其他元素,那么在同一个位置上的元素将以链表的形 式存放,新加入的放在链表头。从HashMap中get元素时,首先会根据key的 hashCode值计算出数组中对应的位置,然后通过equals方法在对应位置的链表中找到 相应的元素。所以,我们要尽量减少Hash冲突,如果每个位置上只有一个元素而不是形 成链表,HashMap的效率将是最高的,时间复杂度将达到最理想的O(1)。不过现实场景 中,基本都会拉链,HashMap查询过程也往往需要做链表遍历,这也导致了查询效率的 下降。

(对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。基于你的collection的大小,也许向HashMap中添加元素会更快,将map换为TreeMap进行有序key的遍历)

在Java1.8后HashMap数据结构中引入了红黑树,当链表过长时,链表会被转化 为树形结构,以此来降低查询时遍历的层级和次数HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变.在java编程语言中,

 

hashTable同步的原因

因为它的remove,put,get做成了同步方法,保证了Hashtable的线程安全性。

每个操作数据的方法都进行同步控制之后,由此带来的问题任何一个时刻只能有一个线程可以操纵Hashtable,所以其效率比较低

 

 

ArrayList和LinkedList的区别

最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)

 

vectory的线程安全(废弃不用的原因)

源代码注释里面很多方法都加上了同步关键字synchronized,但是对于符合操作而言,只是同步方法并没有解决线程安全的问题。要真正达成线程安全,还需要以vector对象为锁,来进行操作。并且vectory的效率低下

所以,如果是这样的话,那么用vector和ArrayList就没有区别了,所以,不推荐使用vector

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值