基础篇-集合

1、hashMap和ConcurrentHashMap的区别

  1. ConcurrentHashMap是线程安全的,在并发的环境下不需要增加额外的同步

  1. HashMap可以使用Collections.synchronizedMap(HashMap)来包装成为同步容器,使得HaspMap的作用几乎和Hashtable一样,每次对Map做修改操作的时候都会锁住这个Map对象。而ConcurrentHashMap会基于并发的等级来划分整个Map来达到线程安全,它只会锁住操作的那一段数据而不是整个Map都上锁。(Hashtable是jdk1的一个遗弃的类,它把所有方法都加上synchronized关键字来实现线程安全。所有的方法都同步这样造成多个线程访问效率特别低。Synchronized Map与HashTable差别不大,也是在并发中作类似的操作,两者的唯一区别就是Synchronized Map没被遗弃,它可以通过使用Collections.synchronizedMap()来包装Map作为同步容器使用。)

  2. ConcurrentHashMap有很好的扩展性,在多线程环境下性能方面比做了同步的HashMap要好,但是在单线程的环境下,HashMap会比ConcurrentMap好一点。

 

2、List 和 Set 区别

相同点:List和Set都是继承自Collection接口,都可以用迭代的方式进行遍历。

不同点:

    1.List的元素是有放入顺序的,元素可以重复。set的元素放入无顺序,元素不可用重复。

    2.Set检索元素效率低下,删除和插入效率高。删除和插入不会引起元素位置的改变。

      List检索元素效率高,删除和插入效率低。删除和插入会引起元素位置的改变,和数组类似可以动态增长。

注意:Set虽然无放入顺序,但元素在set中的位置是有该元素的HashCode决定的。其位置其实是固定的,加入Set 的Object必须定义equals()方法。

 

3、List 和 Map 区别

List是对象集合,允许对象重复。

Map是键值对的集合,不允许key重复。

 

4、Arraylist 与 LinkedList 区别

ArrayList是基于动态数组的数据结构,在内存中是连续存放的。查询效率高,插入和删除效率低。

LinkedList是链表结构,在内存中地址是任意存放的。插入和删除效率高,因为要移动指针所以查询性能低。

 

5、ArrayList 与 Vector 区别

1.Vactor是多线程安全的,Vector类中的很多方法都有synchronize进行修饰,导致Vector在效率上相对较低。

ArrayList是线程不安全的,效率相对较高。

2.两个都是采用线性连续空间存储元素,当扩容空间时,扩容方式不同。

3.Vector可以设置增长因子,而ArrayList不可以。

 

6、HashSet和HashMap区别

HashSet是线性结构,Set中的值不能重复。HashSet中元素的位置是由该元素的HashCode值决定的。

HashMap是键值对集合。实际上是一个“链表散列”的数据结构,即数组和链表的结合体。当多个key的HashCode值一样,value采用链表的结构来进行存储。

 

7、HashMap 的工作原理及代码实现

HashMap 在底层将 key-value 当成一个整体进行处理,这个整体就是一个 Entry 对象。HashMap 底层采用一个 Entry[] 数组来保存所有的 key-value 对,当需要存储一个 Entry 对象时,会根据hash算法来决定其在数组中的存储位置,再根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值