JAVA面试常见问题之常见集合篇

一、List 和 Set 区别html

  • List
    • 能够容许重复的对象。
    • 能够插入多个null元素。
    • 有序容器
  • Set
    • 不容许重复的对象。
    • 只能插入1个null元素
    • 无序容器,可使用TreeSet实现有序

二、Set和hashCode以及equals方法的联系数组

      set集合中存放的数据有一个特色,那就是无序且不重复。无序是由于set集合中的元素没有下坐标。不重复的缘由就是由于set集合中有hashcode与equals这两个方法。安全

三、List 和 Map 区别数据结构

  • 结构:List为单列结构,Map为双列结构
  • 重复性:List为能够重复,Map为双列集合(key-value),key不能够重复
  • 有序性:List为有序集合,Map的key是无序的

四、Arraylist 与 LinkedList 区别多线程

  • 数据结构:ArrayList基于动态数组的数据结构。LinkedList基于链表的数据结构。
  • 操做性ArrayList查询快,增删慢,LinkedList查询慢,增删快。

五、ArrayList 与 Vector 区别并发

  • 同步性Vector线程安全,用synchronized实现线程安全。ArrayList线程不安全。
  • 数据容量增加:两者都有一个初始容量大小,采用线性连续存储空间,当存储的元素的个数超过了容量时,就须要增长两者的存储空间,Vector增加原来的一倍,ArrayList增长原来的0.5倍。

六、HashMap 和 Hashtable 的区别高并发

  • 继承不一样父类:Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但两者都实现了Map接口。
  • 线程安全:Hashtable线程安全,HashMap线程不安全。
  • 是否提供contains方法: HashMap把Hashtable的contains方法去掉了,改为containsValue和containsKey。Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。
  • key和value的是否能够为null值:Hashtable中,key和value都不容许出现null值。HashMap中,null能够做为键,这样的键只有一个;能够有一个或多个键所对应的值为null。

七、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 的区别spa

  • 线程安全性:HashMap线程不安全,ConcurrentHashMap线程安全
  • ConcurrentHashMap特性:性能与安全性兼得。加入分段锁的概念,至关于一个大集合,根据hashcode值分红多个hashtable,根据key.hashCode()来决定把key放到哪一个HashTable中。

九、HashMap 的工做原理及代码实现,何时用到红黑树.net

  • 工做原理:经过hash的方法,经过put和get存储和获取对象。存储对象时,咱们将K/V传给put方法时,它调用hashCode计算hash从而获得bucket位置,进一步存储,HashMap会根据当前bucket的占用状况(当键值对的数量大于容量(capacity)*负载因子(load factor 默认值0.75)时)自动调整容量(超过Load Facotr则resize为原来的2倍)。获  取对象时,咱们将K传给get,它调用hashCode计算hash从而获得bucket位置,并进一步调用equals()方法肯定键值对。若是发生碰撞的时候,Hashmap经过链表将产生碰撞冲突的元素组织起来,在Java 8中,若是一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提升速度。
  • 代码实现:参考 http://www.cnblogs.com/mzc-blogs/p/5800084.html, 也能够直接查看源码
  • 何时用到红黑树:当链表(bucket)的数量大于8时,后面的使用红黑树。使用红黑树增长检索的速度。

十、多线程状况下HashMap死循环的问题

  • 缘由:HashMap是采用链表解决Hash冲突,由于是链表结构,那么就很容易造成闭合的链路(缘由:多线程操做时,可能会有两个或以上的线程同时触发rehash--从新计算hash值--操做,容易形成闭合的链路),这样在循环的时候只要有线程对这个HashMap进行get操做就会产生死循环。
  • 解决思路:用ConcurrentMap代替HashMap

十一、HashMap出现Hash DOS攻击的问题

  • 缘由:

十二、ConcurrentHashMap 的工做原理及代码实现,如何统计全部的元素个数

  • ConcurrentHashMap工做原理容器中有多把锁,每一把锁锁一段数据,这样在多线程访问时不一样段的数据时,就不会存在锁竞争了,这样即可以有效地提升并发效率。这就是ConcurrentHashMap所采用的"分段锁"思想。
  • 代码实现:参考https://www.cnblogs.com/chengxiao/p/6842045.html 或查看源码
  • 如何统计全部的元素个数:size()

1三、手写简单的HashMap

   参考:    https://blog.csdn.net/lishaoran369/article/details/61920036

相关文章
相关标签/搜索