java面试进阶-基础篇:集合

1、List 和 Set 区别

  • List允许重复的对象,允许多个null元素,有序容器,通过索引访问list中的元素,常用的实现类有ArrayList、LinkList和Vector。
  • Set不允许重复对象,只允许一个null元素,无序容器,无法保证元素的顺序。常见实现类有HashSet、LinkHashSet、TreeSet,TreeSet通过Comparetor或Comparable维持排序顺序。TreeSet还实现了SortSet接口,因此它是一个基于Compare和Compareto定义的有序容器。

2、List 和 Map 区别
Map不是collection的子接口或者实现类。Map是一个接口。Map的每一个元素包含两个对象,即键和值。Map元素中的值可以相同,但必须保持键的唯一性。Map值可以有任意多个null,但键最多只能有一个。常见的实现类有HashMap、LinkedHashMap、Hashtable和TreeMap。TreeMap通过comparator和comparable维持排序顺序。

3、Arraylist 与 LinkedList 区别

  • ArraList访问速度方面优于LinkedList,LinkedList需要移动指针,而ArrayList不需要。
  • LinkedList在增加和删除数据方面更加方便,ArrayList需要移动数据和改变数组大小,而LinkedList不需要。
  • 数据结构不同。ArrayList是动态数组的数据结构,LinkedList是链表的数据结构。
  • 简单来说ArraList适于查找,LinkedList适于增添和删除。

4、ArrayList 与 Vector 区别

  • Vector是线程安全的,ArrayList不是线程安全的。
  • 当数组容量不够用的时候,Vector容量增加1倍,ArrayList增加0.5倍。

5、HashMap 和 Hashtable 的区别

  • 线程安全。HashMap不是线程安全的。HashTable是线程安全,所有元素操作都用synchronized修饰。
  • 性能优劣。HashTable是线程安全的,每个方法都要阻塞线程,所以性能比HashMap差。
  • NULL。HashTable键和值都不能为Null,HashMap键和值都可以为空。
  • 实现方式。HashTable继承了Dictionary类,HashMap继承了AbstractMap类。
  • 容量扩容。HashMap初始容量为16,HashTable为11,负载因子均为0.75。当现有容量大于纵容连*负载因子时,HashMap容量翻倍,HasTable容量翻倍+1。
  • 迭代器。HashMap的Iterator迭代器时fail-fast的,HashTable的Enumerator不是fail-fast的。当其它线程增加或删除HashMap时,会报ConcurrentModificatioinException异常,而HashTable不会。

6、HashSet 和 HashMap 区别

  • 实现方式。HashSet实现了Set接口,HashMap实现了Map接口。
  • 存储对象。HashSet进存储对象,HashMap存储键值对。
  • 添加元素。HashSet调用set方法添加元素,HashMap调用put方法添加元素。
  • hashcode。HashSet使用成员对象计算Hashcode并用equals判断两个对象是否相同,HashMap使用键计算hashcode。
  • 查找速度。HashMap比HashSet快,它使用唯一的键获取对象。

7、HashMap 和 ConcurrentHashMap 的区别

  • ConcurrentHashMap底层采用数组+链表实现,线程安全。
  • 通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
  • Hashtable的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。
  • 有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。
  • 扩容:段内扩容(段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容),插入前检测需不需要扩容,有效避免无效扩容。
  • 使用 ConcurrentHashMap,其底层采用分段的数组+链表实现,线程安全,通过把 Map 分为 N 个 Segment(部分),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。
    Hashtable 之所以效率低主要是使用了 synchronized 关键字对 put 等操作进行加锁,而 synchronized 关键字加锁是对整张 Hash 表的,即每次锁住整张表让线程独占,致使效率低下,而 ConcurrentHashMap 在对象中保存了一个 Segment 数组,即将整个Hash表划分为多个分段;而每个Segment元素,即每个分段则类似于一个Hashtable;这样,在执行put操作时首先根据hash算法定位到元素属于哪个Segment,然后对该Segment加锁即可,因此, ConcurrentHashMap 在多线程并发编程中可是实现多线程put操作。

8、HashMap和ConcurrentHashMap 的工作原理及代码实现
链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值