SpringMVC的工作流程
首先我们的用户请求到前段控制器,前段控制器收到请求之后根据处理器的映射器,处理器的适配器根据url找到处理器也就是我们的后端处理器,后端处理器也就是controller对应的requestMapping那个方法,执行完业务逻辑之后会返回一个ModelView到我们的前端控制器dispatcherServlet,再去调用视图解析器去解析,然后返回一个视图给前端控制器,前端控制器再渲染给用户的浏览器
类加载机制
JVM
1.说到jvm首先就是类加载器,他说我们jvm的入口负责把我们的字节码文件加载到jvm当中去形成大的Class对象。
2.其次就是我们的执行引擎,他是把我们java这种高级语言解释转变为计算机语言也就是0,1去操作计算机
3.然后就是我们的运行是数据区,包括方法区,堆,栈,程序计数器。
4.栈 虚拟机栈是我们jvm里线程私有的一个区域,他主要是保存我们方法的局部变量以及对象的引用地址。
5.PC寄存器 他也是线程私有的 用来存放下一条指令的地址。cpu在多个线程之间来回切换然后这个主要是记录到执行到哪里了
6.堆 它是主要存储我们对象的地方,又分为新生区和老年区,新生区分为Eden区和幸存者0和幸存者1区比例为8:1:1。当我们的经过一定数量的gc之后我们的对象会进入到老年区。
volatile
有序性(禁止指令重排)
可见性 (修改过后会通知其他线程)
并不能保证原子性
为什么要使用泛型,用Object不行吗?
用泛型可以使我们的方法更加的灵活。
1、无须类型强转,提高效率,避免了强转出错。
2、通配符"?"的使用提高了程序的阅读性。
3、限制通配符(<? extends T>、<? super T>)提高了程序的健壮性。
锁
公平锁与非公平锁:
未抢占到锁的线程有序等待的叫公平锁,反之是非公平锁。排队公平 插队不公平。
Exception与Error的区别
首先异常分为编译时异常和运行时异常,比如IOException和sqlException在编写代码的时候会强制我们抛出fileNotFoundException和IOException等异常。空指针等异常就属于运行时异常。Exception可以我们程序员手动处理增加我们代码的健壮性,但是一般error是jvm层面的错误,不受程序员控制。
HashMap
1.链表的长度大于8并且容量大于等于64就会变成红黑树 一个treeNode节点的大小是Node节点的2倍,小于6变回链表
2.集合的初始化容量必须是2的幂次方 默认是16
这是因为put元素时是直接把hash值与length-1 hash & (length-1) 当为长度为2的幂次方时候length-1 他的位运算时候低位全都是1, 这样减少了hash冲突,让我们的元素均匀的分配在我们的数组里
1010 1010 0101 0101
0000 0000 0000 1111 位运算后的结果是0101
扩容 reSize
1.8以后不用ReHash了,存的时候是数组(长度-1)& hash值。现在 长度& hash值判断高低位