常见java集合面试题

1.ArrayList VS LinkedList

 

1)ArrayList是用一个可扩容的数组来实现的,LinkedList是用链表实现的

2)数组和链表之间最大的区别就是数组是可以随机访问的

而链表只能从头开始逐个遍历

3)两者在增删改查操作上的区别

在改查 这两个功能上 因为数组能够随机访问 所以ArrayList效率高

在增删 这两个功能上 如果不考虑找到这个元素的时间 数组因为物理上的连续性

当要增删元素时 在尾部还好 但是其他地方就会导致 后续元素都要移动

所以效率极低  而链表可以轻松的端来和下一个元素的连接  直接插入新元素或者溢出旧元素

 

2.ArrayList VS Vector

1) Vector是线程安全的 而ArrayList是线程不安全的

2)Vector默认扩容扩大至2倍  ArrayList默认扩大至1.5倍

3)Vector和ArrayList一样 也是继承自AbstractList底层也是用数组来实现的

但是现在已经被弃用了  因为它是线程安全的  任何好处都是有代价的

线程安全的代价就是效率低 在某些系统很容易成为瓶颈  所以现在大家不再在

数据结构的层面加synchronized 而是把这个任务转移给我们程序员

 

 常见java集合面试题

 

4.HashSet实现原理

HashSet是基于HashMap来实现的 底层采用Hashmap的key存储元素 主要特点是无需的  基本操作都是O(

1)的时间复杂度 

 

5.HashMap的实现原理

JDK1.8之前  数组+链表   之后  数组+红黑树

 

 常见java集合面试题

 

6.HashMap  vs  HashTable

  1. Hashtable是线程安全的 HashMap并非线程安全

  2. HashMap允许key中有null值  Hashtable是不允许的  这样的好处就是可以个诶一个默认值

其实HashMap和Hashtable的关系  就想ArrayList与Vector 以及StringBuilder与StringBuffer

Hashtable是早期JDK提供的接口  HashMap是新版的 这些新版的改进 是因为JDK5之后 

允许数据结构不考虑线程安全的问题 因为实际工作中我们发现没有必要在数据结构的层面上上锁

加锁和方所在系统中是有开销的 内部锁有时候会成为程序的瓶颈

所以HashMap  ArrayList StringBuilder不再考虑线程安全的问题性能提升了很多

 

 

7.为什么改equals  一定要改hashcode()?

首先基于一个假设  任何两个Object 的hashcode都是不通过的 也就是hash function时有效的

那么在这个条件下  有两个object是相等的  如果不重写hashcode 算出来的哈希值 都不一样  就会取到不同的

buckets 了  就迷失在茫茫人海中了 再也无法相认  就和equals()条件矛盾了

 

1)hashcode()决定了key放在这个桶来看的编号 就是在数组里的index

2)equals()是用来比较两个Object是否相同的

 

8.如何解决哈希冲突

1)在发生碰撞的那个桶后面再加一条链来存储

2)顺序查找 如果这个桶里已经被占了 那就按照某种凡是继续找

下一个没有被占的桶  直到找到第一个空的    ------线性探查

 

 

9.Collection  vs  Collectios
Collection  是集合接口 

Collections  是工具类  是集合的操作类  提供了一些静态方法供我们使用 

 

 

 

 

 

 

 

 

 

1.ArrayList VS LinkedList

 

1)ArrayList是用一个可扩容的数组来实现的,LinkedList是用链表实现的

2)数组和链表之间最大的区别就是数组是可以随机访问的

而链表只能从头开始逐个遍历

3)两者在增删改查操作上的区别

在改查 这两个功能上 因为数组能够随机访问 所以ArrayList效率高

在增删 这两个功能上 如果不考虑找到这个元素的时间 数组因为物理上的连续性

当要增删元素时 在尾部还好 但是其他地方就会导致 后续元素都要移动

所以效率极低  而链表可以轻松的端来和下一个元素的连接  直接插入新元素或者溢出旧元素

 

2.ArrayList VS Vector

1) Vector是线程安全的 而ArrayList是线程不安全的

2)Vector默认扩容扩大至2倍  ArrayList默认扩大至1.5倍

3)Vector和ArrayList一样 也是继承自AbstractList底层也是用数组来实现的

但是现在已经被弃用了  因为它是线程安全的  任何好处都是有代价的

线程安全的代价就是效率低 在某些系统很容易成为瓶颈  所以现在大家不再在

数据结构的层面加synchronized 而是把这个任务转移给我们程序员

 

常见java集合面试题

 

4.HashSet实现原理

HashSet是基于HashMap来实现的 底层采用Hashmap的key存储元素 主要特点是无需的  基本操作都是O(1)的时间复杂度 

 

5.HashMap的实现原理

JDK1.8之前  数组+链表   之后  数组+红黑树

 

常见java集合面试题

 

6.HashMap  vs  HashTable

  1. Hashtable是线程安全的 HashMap并非线程安全

  2. HashMap允许key中有null值  Hashtable是不允许的  这样的好处就是可以个诶一个默认值

其实HashMap和Hashtable的关系  就想ArrayList与Vector 以及StringBuilder与StringBuffer

Hashtable是早期JDK提供的接口  HashMap是新版的 这些新版的改进 是因为JDK5之后 

允许数据结构不考虑线程安全的问题 因为实际工作中我们发现没有必要在数据结构的层面上上锁

加锁和方所在系统中是有开销的 内部锁有时候会成为程序的瓶颈

所以HashMap  ArrayList StringBuilder不再考虑线程安全的问题性能提升了很多

 

 

7.为什么改equals  一定要改hashcode()?

首先基于一个假设  任何两个Object 的hashcode都是不通过的 也就是hash function时有效的

那么在这个条件下  有两个object是相等的  如果不重写hashcode 算出来的哈希值 都不一样  就会取到不同的

buckets 了  就迷失在茫茫人海中了 再也无法相认  就和equals()条件矛盾了

 

1)hashcode()决定了key放在这个桶来看的编号 就是在数组里的index

2)equals()是用来比较两个Object是否相同的

 

8.如何解决哈希冲突

1)在发生碰撞的那个桶后面再加一条链来存储

2)顺序查找 如果这个桶里已经被占了 那就按照某种凡是继续找

下一个没有被占的桶  直到找到第一个空的    ------线性探查

 

 

9.Collection  vs  Collections
Collection  是集合接口 

Collections  是工具类  是集合的操作类  提供了一些静态方法供我们使用