你分析过MyBatis工作原理吗?
答:读取配置文件(数据源、事务、映射Sql文件)并返回InputStream流对象、根据IO对象解析出 Configuration对象,创建SqlSessionFactory对象、从 SqlSessionFactory中创建SqlSession、 从SqlSession中调用Executor执行数据库操作&&生成具体SQL指令、 对执行结果进行二次封装、 提交与事务。
Volatile和Synchronized四个不同点?
答: 1 粒度不同,前者针对变量 ,后者锁对象和类
2 syn阻塞,volatile线程不阻塞
3 syn保证三大特性,volatile不保证原子性
Volatile?
指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。
Volatile如何保证内存可见性:
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存。
当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。
阻塞:CPU停下来等一个慢的操作完成以后,才会接着完成其他的工作。
非阻塞:非阻塞就是在这个慢的执行时,CPU去做其他工作,等这个慢的完成后,CPU才会接着完成其后续的操作。
同步:就是一个任务的完成需要依赖另外一个任务,只有等待被依赖的任务完成后,依赖任务才能完成(打电话)。
异步:不需要等待被依赖的任务完成, 特点是通知(短信)。
线程池的作用?
在程序启动的时候就创建若干线程来响应处理。
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
主要实现类: ExecutorService 。
Spring IOC (控制反转,依赖注入)
一个HTTP请求?
DNS域名解析 –> 发起TCP的三次握手 –> 建立TCP连接后发起http请求 –> 服务器响应http请求,浏览器得到html代码 –> 浏览器解析html代码,并请求html代码中的资源(如javascript、css、图片等) –> 浏览器对页面进行渲染呈现给用户。
GET 和 POST 的比较?
Get 请求数据 - 能够被缓存, 有长度限制。
Post 提交数据 - 不会被缓存,没有长度限制。
HashMap 的实现原理?
维护每一个元素是一个链表的数组。
-
实现了数组+链表的特性,查找快,插入删除也快。
-
put 时会调用键的HASH()方法,通过hashCode的遍历entry<K,V>的键值对,如果key.equals(e.key)相等,就对value进行替换。
HashMap、 ConcurrentHashMap、 LinkedHashMap
实现多线程的三种手段,一种是继续Thread类,另外一种是实现Runable接口,还有就是实现Callable接口。
Object中方法notify(唤醒被wait方法阻塞的线程),notifyall,wait(阻塞当前线程)都是用来对给定对象进行线程同步的。
sleep 和 wait 的区别 ? sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU。
堆和栈?
基本类型和引用类型都是在栈中分配的,堆是存放new创建的对象和数组。类变量(static)在程序加载时就在堆中分配内存,地址放在栈中。
ArrayList,Vector, LinkedList?
Vector(线程安全) 默认增长一倍,而ArrayList 却是一半。
IO?
InputStream和OutputStream,子类有File...
InputSteamReader 和 OutputStreamWriter。
程序中输入输出都是以流的形式, 流中保存的是字节文件。字符流是字节流的包装。