收集的一点面试题(应对2018年春招)

框架知识


1、spring AOP实现原理

称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。

AspectJ是静态代理的增强,所谓的静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。

SpringAOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

 

2、spring MVC工作原理

(1)客户端请求提交到DispatcherServlet

(2)由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller

(3)DispatcherServlet将请求提交到Controller

(4)Controller调用业务逻辑处理后,返回ModelAndView

(5)DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图

(6)视图负责将结果显示到客户端

 

3、Spring有几种配置方式?

基于XML的配置;基于注解的配置;基于Java的配置。

 

4、如何用基于XML配置的方式配置Spring?

-- 配置文件的格式通常用<beans>开头,然后一系列的bean定义和专门的应用配置选项组成。

-- 使用被Spring命名空间的所支持的一系列的XML标签来实现的。Spring有以下主要的命名空间:context、beans、tx、aop、mvc等。

 

5、如何用基于Java配置的方式配置Spring?

由@Configuration注解和@Bean注解来实现的。由@Bean注解的方法将会实例化、配置和初始化一个新对象,这个对象将由Spring的IoC容器来管理。@Bean声明所起到的作用与<bean/>元素类似。被@Configuration所注解的类则表示这个类的主要目的是作为bean定义的资源。被@Configuration声明的类可以通过在同一个类的内部调用@bean方法来设置嵌入bean的依赖关系。

 

6、怎样用注解的方式配置Spring?

在XML配置文件中加入<context:annotation-config/>,用注解的方式在Spring中向属性、方法和构造方法中自动装配变量。

-- @Required:该注解应用于设值方法。

-- @Autowired:该注解应用于有值设值方法、非设值方法、构造方法和变量。

-- @Qualifier:该注解和@Autowired注解搭配使用,用于消除特定bean自动装配的歧义。

 

7、Spring Bean的作用域之间有什么区别?

-- singleton:每个容器中只有一个bean的实例,单例的模式由bean factory自身来维护。

-- prototype:为每一个bean请求提供一个实例。

-- request:在请求bean范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

-- Session:每个session中有一个bean的实例,在session过期后,bean会随之失效。

-- global-session:全局的存储变量。

 

8、Spring 框架中都用到了哪些设计模式?

-- 代理模式—在AOP和remoting中被用的比较多。

-- 单例模式—在spring配置文件中定义的bean默认为单例模式。

-- 前端控制器—Spring提供了DispatcherServlet来对请求进行分发。

-- 视图帮助(View Helper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。

-- 依赖注入—贯穿于BeanFactory / ApplicationContext接口的核心理念。

-- 工厂模式—BeanFactory用来创建对象的实例。

 

Java基础

 

1、Runnable和Thread的区别

-- 避免点继承的局限,一个类可以继承多个接口。

-- 适合于资源的共享

(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。

(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。

(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象是,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。

 

2、Java中的volatile 变量是什么?

volatile是一个特殊的修饰符,只有成员变量才能使用它。在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的。volatile变量可以保证下一个读取操作会在前一个写操作之后发生。

 

3、如何终止线程?

(1)引入共享变量,是因为该变量可以被多个执行相同任务的线程用来作为是否中断的信号,通知中断线程的执行。

(2)使用Thread提供的interrupt()方法,因为该方法虽然不会中断一个正在运行的线程,但是它可以使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码。

 

4、Java类加载机制

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并提供了访问方法区内的数据结构的接口。

 

5、String,StringBuilder,StringBuffer三者的区别

运行速度:在这方面运行速度快慢为:StringBuilder > StringBuffer > String。String最慢是因为String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

线程安全:StringBuilder是线程不安全的,而StringBuffer是线程安全的。

总结:

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

 

6、HashMap和HashTable区别

-- Hashtable是线程同步的,而HashMap是异步的。因而Hashtable是线程安全的,HashMap非线程安全。所以HashMap执行效率更高;

--HaspMap可以将空值null作为key或者value。但Hashtable是不能的。

 

7、创建线程的方法

-- 继承Thread类

-- 实现Runnable接口

-- 使用Callable和Future

 

8、什么是死锁?如何避免死锁?

死锁就是进程循环等待它方占有的资源而无限制的僵持下去的局面。

(1)打破互斥条件

(2)打破不可抢占的条件

(3)打破占有申请条件

(4)打破循环等待条件

 

反射机制

 

1、Java反射机制

(1)定义:指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

(2)作用:在运行时判断任意一个对象所属的类;在运行时判断任意一个类所具有的成员变量和方法;在运行时任意调用一个对象的方法;在运行时构造任意一个类的对象。

(3)应用场景:工厂模式中Factory类中用反射的话,添加了一个新的类之后,就不需要再修改工厂类Factory了;数据库JDBC中通过Class.forName(Driver).来获得数据库连接驱动;分析类文件:毕竟能得到类中的方法。

(4)缺点:

-- 反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。

-- 由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。

 

7、框架使用反射机制的好处

增加程序的灵活性。如struts中。请求的派发控制。当请求来到时。struts通过查询配置文件。找到该请求对应的action,然后通过反射实例化action。并调用响应method。如果不适用反射,那么就只能写死到代码里了。大多数情况下反射是为了提高程序的灵活性。因此一般框架中使用较多。因为框架要适用更多的情况。对灵活性要求较高。

 

8、Java反射机制在Spring IOC中的应用

在spring的配置文件中配置一个<bean/>时,通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理获取到配置里面类的实例对象,存入到Spring的bean容器中。

 

设计模式

1、单例模式有几种?

懒汉,饿汉,双重校验锁,枚举和静态内部类。

懒汉单例:没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例。优化可以考虑在getInstance方法上加同步,或者双重检查锁定;

饿汉单例:在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。

双重校验锁:是一种使用同步块加锁的方法。是线程安全的,并且,这种方法实现了懒加载。

枚举:创建枚举默认就是线程安全的,,而且还能防止反序列化导致重新创建新的对象。

静态内部类:这种写法仍然使用JVM本身机制保证了线程安全问题;由于 SingletonHolder 是私有的,除了 getInstance() 之外没有办法访问它,因此它是懒汉式的;同时读取实例的时候不会进行同步,没有性能缺陷;也不依赖 JDK 版本。【Effective Java推荐】

 

2、单例模式的特点

-- 单例类只能有一个实例;

-- 单例类必须自己创建自己的唯一实例;

-- 单例类必须给所有其他对象提供这一实例。

3、工厂模式有几种?

-- 简单工厂模式:实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例。

-- 工厂方法模式:工厂方法模式去掉了简单工厂模式中工厂方法的静态属性,使得它可以被子类继承。这样在简单工厂模式里集中在工厂方法上的压力可以由工厂方法模式里不同的工厂子类来分担。 

-- 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值