java面试1、1.2集合

免责声明:
    本文内容多来自网络文章,转载为我的收藏,分享知识,若有侵权,请联系 博主进行删除。

1.2常见集合

  • List、Set、Map的区别以及选用

List和Set都继承与Collection接口;
List:1.能够容许重复的对象。
   2.能够插入多个null元素。
3.是一个有序容器,保持了每一个元素的插入顺序,输出的顺序就是插入的顺序。
4.经常使用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于常常须要从 List 中添加或删除元素的场合更为合适。
Set:1.不容许重复对象
   2. 无序容器,你没法保证每一个元素的存储顺序,TreeSet经过 Comparator 或者 Comparable 维护了一个排序顺序。
3. 只容许一个 null 元素
4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,所以 TreeSet 是一个根据其 compare() 和
compareTo() 的定义进行排序的有序容器。算法

Map:
1.Map不是collection的子接口或者实现类。Map是一个接口。
2.Map 的 每一个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是惟一的。数组

  1. TreeMap 也经过 Comparator 或者 Comparable 维护了一个排序顺序。
  2. Map 里你能够拥有随意个 null 值但最多只能有一个 null 键。
    5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最经常使用)
  • Set和hashCode以及equals方法的联系

**缓存

set保证里面元素的惟一性实际上是靠两个方法,一是equals()和hashCode()方法;
set在存入数据使用了hashCode(),先进行取hashcode,在将获得的值插入到指定算出来的地址上,若是下次有相同值对应这个地址,则使用equals()比较,相同则过滤,不一样则经过解决冲突算法,将该值存入起来。安全

  • Arraylist 与 LinkedList 区别

**网络

LinkedeList和ArrayList都实现了List接口,可是它们的工做原理却不同。ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
区别:
1) 由于Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),可是要删除数据倒是开销很大的,由于这须要重排数组中的全部数据。
2) 相对于ArrayList,LinkedList插入是更快的。由于LinkedList不像ArrayList同样,不须要改变数组的大小,也不须要在数组装满的时候要将全部的数据从新装入一个新的数组,这是ArrayList最坏的一种状况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还须要更新索引(除了插入数组的尾部)。
3) 相似于插入数据,删除数据时,LinkedList也优于ArrayList。数据结构

  • ArrayList 与 Vector 区别

首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,可以维护元素的次序,而且容许元素的重复。相关区别以下:多线程

一、Vector与ArrayList同样,都是经过数组实现的,不一样的是它支持线程的同步,即某一时刻只有一个线程可以写Vector,避免多线程同时写而引发的不一致性,但实现同步须要很高的花费,所以,访问它比访问ArrayList慢。
二、ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。并发

  • HashMap、ConcurrentHashMap、HashTable的区别

引入ConcurrentHashMap是为了在同步集合HashTable之间有更好的选择,HashTable与HashMap、ConcurrentHashMap主要的区别在于HashMap不是同步的、线程不安全的和不适合应用于多线程并发环境下,而ConcurrentHashMap是线程安全的集合容器,特别是在多线程和并发环境中,一般做为Map的主要实现。性能

一、第一个重要的区别就是ConcurrentHashMap是线程安全的和在并发环境下不须要加额外的同步。虽然它不像Hashtable那样须要一样的同步等级(全表锁),但也有不少实际的用途。
二、你可使用Collections.synchronizedMap(HashMap)来包装HashMap做为同步容器,这时它的做用几乎与Hashtable同样,当每次对Map作修改操做的时候都会锁住这个Map对象,而ConcurrentHashMap会基于并发的等级来划分整个Map来达到线程安全,它只会锁操做的那一段数据而不是整个Map都上锁。
三、ConcurrentHashMap有很好的扩展性,在多线程环境下性能方面比作了同步的HashMap要好,可是在单线程环境下,HashMap会比ConcurrentHashMap好一点。线程

总结一下以上二者的区别,它们在线程安全、扩展性、同步之间的区别。若是是用于缓存的话,ConcurrentHashMap是一个更好的选择,在Java应用中会常常用到。

四、Hashtable是jdk1的一个遗弃的类,它把全部方法都加上synchronized关键字来实现线程安全。全部的方法都同步这样形成多个线程访问效率特别低。Synchronized Map与HashTable差异不大,也是在并发中做相似的操做,二者的惟一区别就是Synchronized Map没被遗弃,它能够经过使用Collections.synchronizedMap()来包装Map做为同步容器使用。

  • HashMap 的工做原理及代码实现,何时用到红黑树

HashMap工做原理及何时用到的红黑树:
在jdk 1.7中,HashMap采用位桶+链表实现,即便用链表处理冲突,同一hash值的链表都存储在一个链表里。可是当位于一个桶中的元素较多,即hash值相等的元素较多时,经过key值依次查找的效率较低。
在jdk 1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减小了查找时间。

原理:
数组中的每个元素所在的位置至关于一个位桶,添加元素的时候,首先计算元素key的hash值,肯定插入数组中的位置(也就是哪一个桶中),若是存在相同的hash值,则放在同一个桶中(元素位置)造成链表,当链表长度超过阈值(8)时,将链表转换为红黑树;

内部结构:
一、HashMap 底层是基于数组和链表实现的,如图所示,其中两个重要的参数:容量和负载因子;容量的默认大小是 16,负载因子是 0.75,当 HashMap 的 size > 16*0.75 时就会发生扩容(容量和负载因子均可以自由调整)。
二、内部包含了一个Node类型的数组 table(Entry<K,V>[] table为jdk 1.7中)。
三、Node存储着键值对。它包含了四个字段,从 next 字段咱们能够看出Node是一个链表。即数组中的每一个位置被当成一个桶,一个桶存放一个链表。HashMap 使用拉链法来解决冲突,同一个链表中存放哈希值相同的Node;

拉链法的工做原理(解决hash冲突):
新建一个 HashMap,默认大小为 16;
插入 <K1,V1> 键值对,先计算 K1 的 hashCode 为 115,使用除留余数法获得所在的桶下标 115%16=3。
插入 <K2,V2> 键值对,先计算 K2 的 hashCode 为 118,使用除留余数法获得所在的桶下标 118%16=6。
插入 <K3,V3> 键值对,先计算 K3 的 hashCode 为 118,使用除留余数法获得所在的桶下标 118%16=6,插在 <K2,V2> 前面。
应该注意到链表的插入是以头插法方式进行的,例如上面的 <K3,V3> 不是插在 <K2,V2> 后面,而是插入在链表头部;

查找须要分红两步进行:
一、计算键值对所在的桶;
二、在链表上顺序查找,时间复杂度显然和链表的长度成正比;
HashMap 容许插入键为 null 的键值对。可是由于没法调用 null 的 hashCode() 方法,也就没法肯定该键值对的桶下标,只能经过强制指定一个桶下标来存放。HashMap 使用第 0 个桶存放键为 null 的键值对。

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

若是扩容前相邻的两个Entry在扩容后仍是分配到相同的table位置上,就会出现死循环的BUG。在复杂的生产环境中,这种状况尽管不常见,可是可能会碰到。

  • HashMap出现Hash DOS攻击的问题

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

  • 看过那些Java集合类的源码

  • 手写简单的HashMap
相关文章
相关标签/搜索