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 而是把这个任务转移给我们程序员
4.HashSet实现原理
HashSet是基于HashMap来实现的 底层采用Hashmap的key存储元素 主要特点是无需的 基本操作都是O(
1)的时间复杂度
5.HashMap的实现原理
JDK1.8之前 数组+链表 之后 数组+红黑树
6.HashMap vs HashTable
-
Hashtable是线程安全的 HashMap并非线程安全
-
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 而是把这个任务转移给我们程序员
4.HashSet实现原理
HashSet是基于HashMap来实现的 底层采用Hashmap的key存储元素 主要特点是无需的 基本操作都是O(1)的时间复杂度
5.HashMap的实现原理
JDK1.8之前 数组+链表 之后 数组+红黑树
6.HashMap vs HashTable
-
Hashtable是线程安全的 HashMap并非线程安全
-
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 是工具类 是集合的操作类 提供了一些静态方法供我们使用