1、springMVC的执行流程:
springMVC是由dispatchservlet为核心的分层控制框架。首先客户端发出一个请求到web服务器,web服务器解析请求的url并去匹配dispatchservlet的映射url,如果匹
配上就将这个请求放入到dispatchservlet,dispatchservlet根据mapping映射配置去寻找相对应的handel,然后把处理权交给找到的handel,handel封装了处理业务逻
辑的代码,当handel处理完后会返回一个逻辑视图modelandview给dispatchservlet,此时的modelandview是一个逻辑视图不是一个正式视图,所以dispatchservlet会通
过viewresource视图资源去解析modelandview,然后将解析后的参数放到view中返回到客户端并展现。
2、servlet执行流程:
客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request、response对象传递给找到的
servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。
3、Struts工作流程:
a) 客户端发出一个请求到servlet容器
b) 请求经过一系列过滤被filterdispatcher调用,filterdispatch通过actionMapper去找相对应的action。
c) Actionmapper找到对应的action返回给filterdispatch,dispatch把处理权交给actionproxy
d) Actionproxy通过配置文件找到对应的action类
e) Actionproxy创建一个actionIinvocation的实例处理业务逻辑
f) 一旦action处理完毕,actioninvocation负责根据stuts.xml的配置找到对应的返回结果。返回结果通常是jsp页面。
4、简单的解释一下垃圾回收:
Java 垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中。一般的实现是划分成3个世代:年
轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。
进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在
方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性。
5、乐观锁
总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。
6、悲观锁
总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。
编程题一(生成六位随机数):
//生成六位随机数
public static void main(String[] args) {
//第一种方法
System.out.println((int)((Math.random()*9+1)*100000));
//第二种方法
Random r = new Random();
String str = "";
for (int i = 0; i < 6; i++) {
str += r.nextInt(10);
}
System.out.println(str);
//第三种方法
String sources = "0123456789";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 6; i++) {
sb.append(sources.charAt(r.nextInt(9)));
}
System.out.println(sb.toString());
}
编程题二(获取指定字符串出现的次数 ):
/**
* 获取指定字符串出现的次数
*
* @param srcText 源字符串
* @param findText 要查找的字符串
* @return
*/
public static int appearNumber(String srcText, String findText) {
int count = 0;
Pattern p = Pattern.compile(findText);
Matcher m = p.matcher(srcText);
while(m.find()){
count++;
}
return count;
}
编程题三(判断文件中某个字符出现的次数):
/**
* 判断文件中某个字符出现的次数
* @param text 判断的字符
* @param file 文件
* @return
* @throws Exception
* @data 2018年11月21日下午3:59:23
* @Author Cloud
*/
public static int appearNumber(String text, File file) throws Exception{
int count = 0;
InputStream is = new FileInputStream(file);
byte[] bytes = new byte[2014];
int a = is.read(bytes);
String[] strs = new String(bytes, 0 ,a).split("");
for (int i = 0; i < strs.length; i++) {
if(text.equals(strs[i])){
count++;
}
}
is.close();
return count;
}
编程题四(冒泡排序):
/**
* 冒泡排序
* @param arr
* @return
* @data 2018年11月22日上午10:22:31
* @Author Cloud
*/
public static int[] mpSort(int[] arr){
int warp = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if(arr[j] > arr[i]){
warp = arr[i];
arr[i] = arr[j];
arr[j] = warp;
}
}
}
return arr;
}
编程题五(二分查找算法):
/**
* 二分查找算法
* @param arr
* @param tag
* @return
* @data 2018年11月22日上午10:36:21
* @Author Cloud
*/
public static int efSelect(int[] arr, int tag){
int frist = 0;
int end = arr.length;
for (int i = 0; i < arr.length; i++) {
int moddle = (frist + end) / 2;
if(tag == arr[moddle]){
return moddle;
}
if(tag > arr[moddle]){
frist = moddle + 1;
}
if(tag < arr[moddle]){
end = moddle - 1;
}
}
return 0;
}