参考 https://blog.csdn.net/m0_57624732/article/details/116996038
Java基础
1.HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。 在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。 简单说下HashMap的实现原理 首先有一个每个元素都是链表(可能表述不准确)的数组,当添加一个元素(key-value)时,就首先计算元素key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这时就添加到同一hash值的元素的后面,他们在数组的同一位置,但是形成了链表,同一各链表上的Hash值是相同的,所以说数组存放的是链表。而当链表长度太长时,链表就转换为红黑树,这样大大提高了查找的效率。 HasMap的扩容机制resize() 构造hash表时,如果不指明初始大小,默认大小为16(即Node数组大小16),如果Node[]数组中的元素达到(填充比*Node.length)重新调整HashMap大小 变为原来2倍大小,扩容很耗时 HashMap和Hashtable ConcurrentMap的区别 Hashmap 可以 存储Key为null的值,线程不安全,但是效率高 Hashtable 不可以 存储Key为null的值,线程安全,但是效率低 ConcurrentMap 不可以有null键,线程安全,原子操作。 一个ConcurrentHashMap 由多个segment 组成,每个segment 包含一个Entity 的数组。这里比HashMap 多了一个segment 类。该类继承了ReentrantLock 类,所以本身是一个锁。Spring事物(@transactional注解)在什么情况下会失效,为什么?
一、@transactional 的使用
1、一般在service里加@Transactional注解,不建议在接口上添加 2、加了此注解后每个业务方法执行时,都会开启一个事务,不过都是按照相同的管理机制。 3、@Transactional注解只能应用到public修饰符上,其它修饰符不起作用,但不报错。 4、默认情况下此注解会对unchecked异常进行回滚,对checked异常不回滚。那什么是unchecked,什么是checked呢?通俗的说,编译器能检测到的是checked,检测不到的就是unchecked。 派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常。 继承自Exception的异常统称为checked异常,如 IOException、TimeoutException等。平衡二叉树,B树,B+树,B*树 https://blog.csdn.net/chai471793/article/details/99563704不回滚解决方案
1,检查方法是不是public 2,检查异常是不是unchecked异常 3,如果是checked异常也想回滚的话,注解上写明异常类型即可@Transactional(rollbackFor=Exception.class)