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)。