java必须掌握的技术点--基础篇--(四)

java面试汇总专栏

集合

  • ArrayList 与 Vector 区别

  1. ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
  2. Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
  3. LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
  4. ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
  5. Vector提供indexOf(obj, start)接口,ArrayList没有。
  6. Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。
  • HashMap 和 Hashtable 的区别

HashMap 不是线程安全的

HashMap 是 map 接口的实现类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap 允许 null key 和 null value,而 HashTable 不允许。

HashTable 是线程安全 Collection。

HashMap 是 HashTable 的轻量级实现,他们都完成了Map 接口,主要区别在于 HashMap 允许 null key 和 null value,由于非线程安全,效率上可能高于 Hashtable。

区别如下:

  1. HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。
  2. HashMap 把 Hashtable 的 contains 方法去掉了,改成 containsValue 和 containsKey。因为 contains 方法容易让人引起误解。
  3. HashTable 继承自 Dictionary 类,而 HashMap 是 Java1.2 引进的 Map interface 的一个实现。
  4. HashTable 的方法是 Synchronize 的,而 HashMap 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。
  5. Hashtable 和 HashMap 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差异。
  • HashSet 和 HashMap 区别

*HashMap**HashSet*
HashMap实现了Map接口HashSet实现了Set接口
HashMap储存键值对HashSet仅仅存储对象
使用put()方法将元素放入map中使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象HashSet较HashMap来说比较慢
  • HashMap 和 ConcurrentHashMap 的区别

Hashmap的key和value都可以为null, 是非线程安全的,存储的是键值对;

hashmap是基于哈希的原理,put存入键值对时,会对键调用 hashCode()方法,返回的hashcode用于找到bucket位置来存储Entry对象,hashMap是在bucket中储存键对象和值对象。当两个对象的hashcode相同时,代表他们的bucket位置相同,此时会发生“碰撞”。因为hashmap 是使用链表存储对象,所以这个对象会存储在链表中。那么两个对象的hashcode相同时,get方法获取对象是如何操作的呢?会根据键值找到bucket存储位置,在遍历链表调用keys.equals()找到链表中正确的节点,最终找到要找的值对象。(这里能够遍历获取正确的值是因为链表中存储的是键值对)

通过采用合适的equal()和hashcode()将会减少碰撞的发生,提高效率。

hashmap默认的负载因子大小是0.75,即当一个map填满了75%的bucket时,和其他集合(如Arraylist)一样,将会创建原来hashmap大小的两倍的bucket数组,来重新调整map的大小。并将原来的对象放入新的bucket数组中。在重新调整hashmap大小中存在哪些问题呢?在多线程条件下会存在条件竞争。因为如果两个线程都发现HashMap需要重新调整大小了,他们就会同时试着调整大小。在调整大小的过程中,存储在链表中的元素次序会反过来,因为移动到新的bucket位置时,hashmap并不会将元素放在链表的尾部,而是放在头部,如果条件竞争了,就会死循环。所以多线程慎用hashmap。所以concurrentHashmap应运而生。

  • HashMap 的工作原理及代码实现

简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

通过hash的方法,通过put和get存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。如果发生碰撞的时候,Hashmap通过链表将产生碰撞冲突的元素组织起来,在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。

https://yikun.github.io/2015/04/01/Java-HashMap工作原理及实现/

  • ConcurrentHashMap 的工作原理及代码实现

ConcurrentHashMap采用了非常精妙的"分段锁"策略,ConcurrentHashMap的主干是个Segment数组。Segment继承了ReentrantLock,所以它就是一种可重入锁(ReentrantLock)。在ConcurrentHashMap,一个Segment就是一个子哈希表,Segment里维护了一个HashEntry数组,并发环境下,对于不同Segment的数据进行操作是不用考虑锁竞争的。

  当问到我们有关于ConcurrentHashMap的工作原理以及实现时,可以从以下几个方面说:

  • ConcurrentHashMap的优点,即HashMap和HashTable的缺点。

  • ConcurrentHashMap两个静态内部类:HsahEntry和segment
  • ConcurrentHashMap含有16个segment
  • ConcurrentHashMap的put方法:根据hash值找到对应的segment,segment是分段锁。
  • ConcurrentHashMap的get方法:count>0,hash找到HashEntry,hash相等并且key相同,若取value为null,加锁重新获取。
  • ConcurrentHashMap的remove方法:加锁,每删除一个元素就将那之前的元素克隆一边。因为设置为第一次next之后不能再改变。
  • ConcurrentHashMap的size()方法:2次不锁住segment方式统计各个segment的大小,若count发生变化,采用加锁方式统计。modCount变量,在put,remove和clean方法里操作元素,modcount加1.

ConcurrentHashMap是Java1.5中引用的一个线程安全的支持高并发的HashMap集合类。

https://www.cnblogs.com/heqiyoujing/p/10928423.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值