ArryList 、Vector、LinkedList 区别
ArrayList:当在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;
Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差。
LinkedList:当在一列数据的前面或中间添加或删除数据,并且按照插入顺序访问其中的元素时,就应该使用LinkedList了。
HashMap、HashTable、LinkedHashMap、TreeMap、ConcurrentHashMap的区别
HashMap:key、value都可以为null,线程不同步,无序,访问速度快。若要同步可以加synchronizedMap或者使用ConcurrentHashMap。
LinkedHashMap:是HashMap的一个子类,保存了记录的插入顺序,遍历的时候会比HashMap慢。
HashTable:key、value都不能为null,线程同步,使用了synchronized对put进行加锁,读写速度慢。
TreeMap:不允许null,线程不安全,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素。默认是按键升序排序。
ConcurrentHashMap:高性能的线程安全HashMap。使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。
HashSet、TreeSet、LinkedHashSet区别
HashSet:数据无序,不是同步的,只能放入一个null
LinkedHashSet:数据有序
TreeSet:二差树实现的,自动排序,存入TreeSet的元素应当实现Comparable接口或者实现Comparator接口,不允许放入null值
SpringMVC五大组件
DispatcherServlet收到请求之后,依据 HandlerMapping的配置调用相应的Controller来处理。
Controller将处理结果封装成ModelAndView, 然后返回给DispatcherServlet。
DispatcherServlet依据ViewResovler的 解析,调用相应的视图对象(比如某个jsp)来生成 相应的页面。
事务
https://zhidao.baidu.com/question/104479831.html
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。主要用于一些对操作过程的完整性比较高的程序。比如银行系统,用户在转账的过程中程序出现错误,但是这个转账操作没有完成。那么这个操作就被退回。
主要目的:保证数据的一致性和完整性。
特性:
1.原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做
2.一致性:在事务执行前后,数据状态保持一致性。数据不会因为事务的执行而遭到破坏
3.隔离性:一个事务的执行,不受其他事务的干扰,即并发执行的事务之间互不干扰
4.持久性:一个事务一旦提交,它对数据库的改变就是永久的
事务的实现方式:实现方式共有两种:编码方式;声明式事务管理方式
基于AOP技术实现的声明式事务管理,实质就是:在方法执行前后进行拦截,然后再目标方法开始之前创建并加入事务,执行完目标方法后根据执行情况提交或回滚事务.
声明式事务管理又有两种实现方式:基于xml配置文件的方式;另一个实在业务方法上进行@Transaction注解,将事务规则应用到业务逻辑中
一种常见的事务管理配置:事务拦截器TransactionInterceptor和事务自动代理BeanNameAutoProxyCreator相结合的方式
4.面向切面AOP
面向切面编程,把散落在程序中的公共部分提取出来,做成切面类,这样的好处在于,代码的可重用,一旦涉及到该功能的需求发生变化,只要修改该代码就行,否则,你要到处修改,如果只要修改1、2处那还可以接受,万一有1000处呢。
AOP底层的东西就是JDK动态代理和CGLIB代理,说白了就是增强类的功能。
最常用的AOP应用在数据库连接以及事务处理上。
AOP是面向切面编程,是通过代理的方式为程序添加统一功能,集中解决一些公共问题。
AOP的应用:Spring声明式事务.
AOP通知的类型有:前通知,后通知,环绕通知,异常通知
5.反射机制
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射是什么呢?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,举个例子我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.dbtest.myqlConnection,com.dbtest.oracleConnection这两个类我们要用,这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.dbtest.myqlConnection");通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!
多线程
建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC。这个问题用Object的wait(),notify()就可以很方便的解决。代码如下:
/**
* wait用法
* @author DreamSea
* @time 2015.3.9
*/
package com.multithread.wait;
public class MyThreadPrinter2 implements Runnable {
private String name;
private Object prev;
private Object self;
private MyThreadPrinter2(String name, Object prev, Object self) {
this.name = name;
this.prev = prev;
this.self = self;
}
@Override
public void run() {
int count = 10;
while (count > 0) {
synchronized (prev) {
synchronized (self) {
System.out.print(name);
count--;
self.notify();
}
try {
prev.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws Exception {
Object a = new Object();
Object b = new Object();
Object c = new Object();
MyThreadPrinter2 pa = new MyThreadPrinter2("A", c, a);
MyThreadPrinter2 pb = new MyThreadPrinter2("B", a, b);
MyThreadPrinter2 pc = new MyThreadPrinter2("C", b, c);
new Thread(pa).start();
Thread.sleep(100); //确保按顺序A、B、C执行
new Thread(pb).start();
Thread.sleep(100);
new Thread(pc).start();
Thread.sleep(100);
}
}
Spring 框架中用到了哪些设计模式
BeanFactory
、ApplicationContext
创建 bean 对象。jdbcTemplate
、hibernateTemplate
等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。Controller
。