威海网站建设公司哪家好太原网站制作推广
1.自我介绍:
2.基础 :
1.集合 : java容器中分为collection 和map两大类
collection 分为list集合(有序且重复的),set集合(无序,不可重复)
list集合分为arrayList集合 : 查询快,增删慢,它是基于数组结构的,对数据的增删是在数组的尾部进行添加或删除的,其效率相对于LinkedList来说还是比较慢的,因为LinkedList是基于链表结构的查询慢增删快,它的增删只需要去改变指针的指向即可.并且arrayList做增删时还存在扩容问题,他的扩容是需要生成新的集合并且在原数组的基础上扩容1.5倍,他的 默认容量为10
set集合分为HashSet(无序且不可重复的,可以存储null值),TreeSet集合(他的底层是通过HashMap去实现的,对key去存储set元素,在里面会对元素进行排序,所以他不能存储null值)
map集合 :
HashMap集合: 他是基于key,value形式,基于数组和链表结构的,在对数据操作时继承了数组的线性查找和链表的寻址修改,并且HashMap集合是线程不安全的
原因 :
1.在jdk1.7中会造成环形链和数据丢失的情况
2.在jdk1.8中hashMap的put过程会造成数据覆盖的情况,其put过程为 : 1.对key求哈希值 2.判断是否发送哈希碰撞(求出的值相同),发生了碰撞就放入桶中,没有发生碰撞就以链表的形式链接到后面 3.链表的长度大于8会转为红黑树,链表的长度小于6会 从红黑素转为链表(这也是HashMap的存储机制)
线程安全的集合 :
1.copyOnWriteArraylist 2.copyOnWriteArraySet 3.HashMap
4.HashTable (执行的效率差,他是对整个HashTable进行加锁,同一时间只能有一个线程访问 )
5.ConcurrentHashMap 是一个无论在读或写操作上都支持很高性能的集合,在执行读操作的时候他几乎不需要加锁,在执行写操作时默认支持16个线程执行并发写操作(因为他里面的segment默认就是16个并发级别,支持扩张)
ConcurrentHashMap的存储机制 :
在jdk1.7中采用锁分段技术,将一个HashMap分为多个段,每段都加一把锁,这样就可以支持多线程的访问,以及不会影响系统对其他段的访问
在jdk1.8中采用CAS+Synchronized+Node+红黑树去实现的,更大程度上降低了锁的粒度
String和StringBuffer和StringBuilder的区别 :
string是一个不可变的类,在对字符串操作是会生成一个新的string对象,这样做的效率会很差并且还会消耗内存
StringBuffer是一个可变的线程安全的类,在对字符串操作时不会生成新的string对象,并且它里面有一个缓存区容量,当字符串的大小没有超过这个容量时,不会分配新的容量的
Stringbuilder也是一个可变的类,但是他是线程不安全的
1.如果我们对少量字符串操作时可以使用string类
2.如果在多线程下对大量字符串操作时,需要使用StringBuffer类,反之使用StringBuilder类
MySql :
在5.7版本以后默认值从的存储引擎是InnoDb,给,MySql的表提供了事物的处理,回滚以及崩溃修复的功能和多版本并发控制的事物安全,他支持外键,也就是当父表中的数据更新时字表中的数据也必须要有相应的改变,他总是支持自动增长且唯一不为空,在MySql中自动增长的列为主键,他的缺点是读写效率差执行速度慢
事物四大特性 :
原子性 : 一个或多个事物要么全部执行成功要么全部执行失败
一致性 : 一个事物可以从一种一致性的状态切换到另一种一致性的状态
隔离性 : 一个事物对数据的操作对其他事物是不可见的,多个事物之间是存在隔离的
持久性 : 一个事物对数据的修改在数据库中的改变是永久的,并且不支持回滚
事物的隔离级别 :
读未提交 : 会引发脏读,幻读,不可重复读
读已提交 : 会引发幻读,不可重复的
重复的 : 会引发不可重复读
串行化 : 从隔离级别来说,他是最高的隔离级别,从并发性上来说是最低的
脏读 : 一个事物读取到另一个事物未提交的数据,导致前后两次读取到的数据不一致
幻读 : 一个事物读取到另一个事物已提交的数据,导致前后两次读取到的数据不一致
不可重复读 : 一个事物前后两次读取到的数据不一致,由于其他事物插入数据导致事物并发的情况
索引优化 :
(高并发的处理方式,避免全表扫描,尽量使用索引)
导致全表扫描,索引时效的情况 :
1. 索引列使用函数计算
2. 模糊查询的左模糊(因为mysql是遵循最左匹配原则,所以使用左模糊时匹配的是一个占位符)
3. is not null 不走索引
4. or的使用不当(大于,小于,不等于等范围查询)
5.参数类型与字段类型不匹配,会导致类型发送隐式转换,索引失效
#{}和${}的区别 :
#{}可以防止sql注入,在进行编译时会解析为一个 占位符并且自动拼接单引号,不会改变参数的数据类型
${}不能防止sql注入,在编译时他是做一个string类型的转换,解析出什么就是什么=和Eq
==和equals的区别 :
== 比较的是参数值
equals在引用数据类型中没有重写euals时比较的是地址值;重写equals方法后比较的是地址值中的内容
mybatis : 支持定制化,存储过程和高级映射,几乎可以避免所有的jdbc代码和手动设置参数以及获取数据集
mybatisPlus : 是在mybatis上只做增强不做改变,主要是为了简化开发和提高效率
他的优点是损耗小,启动就会注入基本的crud,性能上基本无损耗,属于直接面向对象的操作,并且支持lambada表达式,内嵌服务器,拦截器分页插件等
他的缓存级别分为 :
一级缓存 : 默认开启的,他的增删需要清空一级缓存,是属于sqlSession中的缓存,他的生命周期和sqlSession一致的
二级缓存 : 他是sqlSessionFactory中的缓存,需要手动开启,如果我们每次查询都需要使用最新的数据时,需要禁用二级缓存的