职场面试题总结(45)---DELETE、TRUNCATE、DROP的区别、Arraylist与Linkedlist 分析、集合默认容量与扩容机制分析

125 阅读3分钟

1、DELETE、TRUNCATE、DROP的区别

在这里插入图片描述

因此,在不再需要一张表的时候,用drop;在想删除部分数据行时候,用delete;在保留表而删除所有数据的时候用truncate。

2、Arraylist与Linkedlist 分析

Arraylist

底层是基于动态数组。

根据下标访问数组元素的效率高,向尾部添加元素的效率高。

删除数组中元素以及向数组中间添加数据的效率低,因为需要移动数组最坏情况是删除第一个元素,那就要把第2-第n个元素都往前移动一位。

之所以称之为动态数组,是因为Arraylist在数组容量超过上限后可以扩容(JDK1.8之后数组扩容后是之前的1.5倍)Arraylist源码中最大的数组容量是Integer.MAX\_VALUE-8,对于空出的8位,目前解释是:

1)存储Headerwords。

2)避免一些机器内存溢出,减少出错几率,所以少分配。

3)最大还是能支持到Integer.MAX_VALUE(当Integer.MAX_VALUE-8依旧无法满足需求时)。

Linkedlist

Linkedlist基于链表的动态数组数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历。

总结

(1)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

(2)各自效率问题:

ArrayList是线性表(数组)

get()直接读取第几个下标,复杂度O(1)。

add(E)添加元素,直接在后面添加,复杂度O(1)。

add(index,E)添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)。

remove()删除元素,后面的元素需要逐个移动,复杂度O(n)。

LinkedList是链表的操作

get()获取第几个元素,依次遍历,复杂度O(n)。

add(E)添加到未尾,复杂度O(1)。

add(index,E)添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)。

remove()删除元素,直接指针指向操作,复杂度O(1)。

3、集合默认容量与扩容机制分析

(1)ArrayList

默认容量:10。

扩容机制:当发现容量不足时扩容,容量为原来的1.5倍+1。

(2)LinkedList

默认容量:0。

扩容机制:无。

(3)Vector

默认容量:10。

扩容机制:当发现容量不足时,扩容到原来的两倍。

(4)HashSet

默认容量:16。

扩容机制:加载因子为0.75,当超过这个阈值时扩容,扩容到原来的两倍。它的子链表达到8时,转化成红黑树。小于6个转化成链表。

(5)HashMap

默认容量:16。

扩容机制:加载因子为0.75,当超过这个阈值时扩容,扩容到原来的两倍。它的子链表达到8时,转化成红黑树。小于6个转化成链表。

(6)Hashtable

默认容量:11。

扩容机制:加载因子为0.75,当超过这个阈值时扩容,扩容为2*原数组长度+1。

4、Hystrix隔离机制

线程池隔离

优点:

1)支持排队和超时。

2)支持异步调用。

缺点:

线程调用会产生额外的开销。

适用场景:

1)不受信客户。

2)有限扇出。

信号量隔离

优点:

1)轻量。

2)无额外开销。

缺点:

1)不支持任务排队和主动超时。

2)不支持异步调用。

适用场景:

1)受信客户。

2)高扇出(网关)。

3)高频高速调用(cache)。