Java面试准备

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 框架中用到了哪些设计模式

  • 工厂设计模式 : Spring使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
  • 代理设计模式 : Spring AOP 功能的实现。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  • 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller

 

 

 

 

你可能感兴趣的:(java)