HashMap的存储机制
创建一个HashMap集合时,默认创建一个初始长度为16的数组。(它的加载因子是0.75)当我们往HashMap集合中添加键值对的时候,首先根据键的Hash码除以数组的长度取余来确定键值对在HashMap中的位置。(hash码的算法见博主的另一篇博客默认的HashCode值的运算方式)当这个位置已经有值时,以链表的结构存储。在jdk1.8中,当链表的长度大于8时,将链表结构转换为红黑树进行存储。ConcurrentHashMap的锁机制
在HashMap的基础上加入锁机制,即创建的map的初始数组中每个元素为一个区块,当线程A对当前键值对进行操作时,只会锁住当前区块,不会影响其他线程对其他区块的操作,提高了map在多线程并发操作时的效率。 在jdk1.8中ConcurrentHashMap与HashMap的数据结构基本一致,只是增加了同步的操作来控制并发。
有两种排序方式:1,自然排序 2,比较器排序 自然排序:在元素类中定义排序规则。 比较器排序:给TreeSet集合指定比较器,根据提供的比较器进行排序。
线程优先级
线程是具有优先级的,优先级高的线程比优先级低的线程具有更多的执行机会,而不是优先级高的先执行,优先级低的后执行。优先级一共有10级,最低1级,最高10级,默认5级。
守护线程 线程分为两类:用户线程和守护线程。用户线程是具有独立业务流的线程,守护线程为用户线程提供服务。 当所有用户线程都执行结束,即使守护线程线程体没有执行完也会停止。 如果有任何一个用户线程没有执行完,即使守护线程结束了也不会停止,进入等待状态,直到最后一个用户线程执行结束。
当线程的数量很多,并且每个线程执行结束就销毁,这样频繁创建和销毁线程会大大降低系统的效率。 线程池就是一个线程的容器,通过线程池对线程进行管理,当线程池收到任务时,首先会调用线程池中已经存在的线程处理任务,如果没有空闲线程会创建新的线程,当线程使用完成后也不会立即销毁,而是放入线程池中以备下次使用。
数据库连接池是一个装有很多连接的一个容器,使用连接的时候可以直接从连接池中获取,使用完成后归还给连接池。
事务的特性 a)原子性,一个事务中的多个步骤要么全部完成,要么全部不做。 b)一致性,在事务开始之前和事务完成之后,数据库中的数据的完整性和一致性不能被破坏。 c)隔离性,数据库允许多个事务并发,但是多个事务之间不能相互交叉执行导致数据不一致,多个并行的事务之间不能互相影响。 d)持久性,事务完成后,对数据的操作是永久的。
隔离级别 读未提交,就是一个事务可以读取另一个事务未提交的数据。 读已提交,就是一个事务要等另一个事务提交后才可以读取数据。 重复读,就是在开始读取数据时,不再允许修改操作。 序列化,最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读,不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
不同的隔离级别的事务并发时可能出现的问题 脏读,T1事务读取了T2事务未提交的数据。 不可重复读,在一次事务中两次读取的数据不一致。 幻读,如第一个事务对表中的数据进行了修改,这种修改涉及到表中的全部的数据行,同时第二个事务向表中插入了一行新数据,那么第一个用户发现表中还有没有修改的数据行 ,就像发生了幻觉一样。
1.request 2.response 3.session 4.application 5.out 6.page 7.config 8.exception 9.pageContext
请求跳转特点:一次请求,浏览器地址不变,传输的数据不会丢失。 重定向跳转特点:二次请求,浏览器地址发生变化,传输的数据会丢失。
MVC就是把代码分成三块,第一块view表示视图,第二块model表示模型,第三块controller表示控制器。
view是程序中负责生成用户界面的部分,也是整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。model是程序的主体部分,所有的业务逻辑都写在该层。controller是根据用户的输入,控制用户界面的数据显示,更新model对象状态的部分。缓存机制 MyBatis有一级缓存和二级缓存。 一级缓存是SqlSession级别的缓存,只要SqlSession没有刷新和关闭,它就存在。 二级缓存是mapper映射级别的缓存,多个SqlSession可以操作同一个mapper映射的sql语句,多个SqlSession可以共用一个二级缓存,二级缓存是跨SqlSession的。
延迟加载 就是在需要用到数据时才进行加载,不需要用到数据就不加载数据,延迟加载也称懒加载。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,用于解决企业应用开发的复杂性问题。 IoC:Spring通过一种称作控制反转(IoC)的技术促进了松耦合,当应用了IoC,一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或查找依赖对象。 AOP:Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。
1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet 。 2. DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。 3-4. DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。 5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。 6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。 7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。