Java理论知识及面试题

一.springMVC 的工作(实现)原理?

工作原理

1、客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.

2、DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。

3-4、DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。

5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。

6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。

7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

 

二.struts2工作(实现)原理?

工作原理

一个请求在Struts2框架中的处理大概分为以下几个步骤

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action,FilterDispatcher是控制器的核心,就是mvc中c控制层的核心。

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy

5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。

6、ActionProxy创建一个ActionInvocation的实例。

7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

 

三.SpringMVC 和Struts2的区别?

1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同。

2. 性能:spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,但要小心把握像在servlet控制数据一样。spring3 mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3 mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;struts2实际上是通 setter getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。

3. 参数传递:struts是在接受参数的时候,可以用属性来接受参数,这就说明参数是让多个方法共享的。

4. 设计思想上:struts更加符合oop(面向对象编程)的编程思想, spring就比较谨慎,在servlet上扩展。

 

四.三大框架整合步骤(详细)

1、导入必须框架jar()
2、jar addtoBuildPath
3、 建立对应各个层包
4、建立bean(entry)-----加上hibernate需要的对应的注解
5、web.xml加入struts需要的拦截(只针对struts的配置)
在action中实现ModelDriven 接口,可以快速从表单装入对应实体属性
6、新建struts.xml,设置好对应跳转关系
7、根据struts建立对应jsp和action

注意事项:
1、需要去掉整合spring需要的struts2-spring-plugin-2.1.6.jar,不然运行只有struts配置时,会报错。
2、注意路径问题。在struts.xml中的package name="user" 是跳转的“相对值”,所以,如果设置jsp的所在的文件夹(如果设置文件夹的话)和strut对应包的name对应,
可以使用同一个对应值,转发时比较方便,直接写对应jsp即可,因为会默认包含对应所在的包。或者,使用绝对路径(比较好理解),直接 /jsp所在文件夹/xxx.jsp

 

五.JAVA中反射是什么?

java通常是先有类再有对象,有对象我就可以调用方法或者属性。反射其实是通过Class对象来调用类里面的方法。通过反射可以调用私有方法和私有属性。大部分框架都是运用反射原理


Mybatis部分

1、mybatis与hibernate区别?

  Hibernate是面向对象的思想操作数据、mybatis是以纯sql操作数据

  相对于mybatis容易优化.扩展性好,但是移植性差。

2、mybatis如何动态sql?

  MyBatis的动态SQL是基于OGNL表达式的

SpringMVC部分

1、springmvc工作原理

   1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。

   2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.

   3.DispatcherServlet请请求提交到目标Controller

   4.Controller进行业务逻辑处理后,会返回一个ModelAndView

   5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象

   6.视图对象负责渲染返回给客户端。

什么是单例?

  单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:

第一种(懒汉,线程安全):

public class Singleton {

private static Singleton instance;

   public static synchronized Singleton getInstance() {

    if (instance == null) {

      instance = new Singleton();

    }

    return instance;

    }

}

第二种(饿汉):

public class Singleton {

  private static Singleton instance = new Singleton();

    private Singleton (){}

    private Singleton (){}{

      return instance;

    }

}

什么是webserivce?

  Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力。

  Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。

  SOAP是一种简单基于xml的轻量协议,用户web上交换结构化信息和类型信息。

  soap请求是HTTP POST的一个专用版本,遵循一种特殊的xml消息格式Content-type设置为: text/xml任何数据都可以xml化。

Spring部分

1、说说spring?

spring的核心是控制反转、依赖注入,aop(面向切面)相当于把每个bean与bean之间的关系交给第 三方容器进行管理.

2、说springioc、springvaop?

spring IOC 相当于把每个bean与bean之间的关系交给第三方容器管理。而这个容器就是spring

springaop 面向切面的编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。 springaop 就是用 Javva的动态代理

3、简述spring的优缺点?

spring 的优点:

   1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦?

   2.可以使用容易提供的众多服务,如事务管理,消息服务等?

   3.容器提供单例模式支持

   4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能?

  5.容器提供了众多的辅助类,能加快应用的开发?

   6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等?

   7.spring属于低侵入式设计,代码的污染极低?

   8.独立于各种应用服务器?

   9.spring的DI机制降低了业务对象替换的复杂性?

   10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部?

  缺点:用到了大量的反射机制,执行效率比较低

4、spring的生命周期?

  Spring容器 从XML 文件中读取bean的定义,并实例化bean。

  Spring根据bean的定义填充所有的属性。

  如果bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。

  如果Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。

  如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。

  如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。

  如果有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。

  如果bean实现了 DisposableBean,它将调用destroy()方法。

5、Spring框架中的单例bean是线程安全的吗?

  不,Spring框架中的单例bean不是线程安全的。

6、说说spring的作用域

  singleton:在每个Spring IoC容器中一个bean定义对应一个对象实例。

  prototype:一个bean定义对应多个对象实例

  request:在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext 情形下有效。

  session:在一个HTTP Session 中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext 情形下有效。

  global session:在一个全局的HTTP Session 中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext 情形下有效。

7. @Required 注解

  这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。

8. @Autowired 注解

  @Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。

9. @Qualifier 注解

  当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的bean。

10、Spring面向切面编程(AOP)

   a. 解释AOP

    面向切面的编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

  b. Aspect 切面

    AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

   c.在Spring AOP 中,关注点和横切关注的区别是什么?

    关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
    横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

   d. 连接点

    连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。

   e. 通知

    通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。

  Spring切面可以应用五种类型的通知:

    before:前置通知,在一个方法执行前被调用。

    after: 在方法执行之后调用的通知,无论方法执行是否成功。

    after-returning: 仅当方法成功完成后执行的通知。

    after-throwing: 在方法抛出异常退出时执行的通知。

    around: 在方法执行之前和之后调用的通知。

   f. 切点

     切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

  g. 什么是引入?

    引入允许我们在已存在的类中增加新的方法和属性。

  f. 什么是目标对象?

    被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

  g. 什么是代理?

    代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

  h. 有几种不同类型的自动代理?

    BeanNameAutoProxyCreator

    DefaultAdvisorAutoProxyCreator

    Metadata autoproxying

hibernate部分

1、说一下orm与jdbc的区别?

  jdbc只是一个java操作数据库的规范接口而已

  orm不过是一种思想,对象关系映射。

  ORM:是对象关系模型,如hibernate,让你以面向对象的方式去编程。封装了JDBC.

  JDBC:是从底层访问数据库服务器。一般银行,金融行业为了安全起见,直接用JDBC访问

2、说说hibernate?

  hibernate是一个基于ORM持久框架,可以让程序员以面向对象的思想操作数据库,提高生产效率.

3、hibernate的懒加载? 有几种禁用方法

  在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。

  我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。

    1.使用代理对象:Hibernate.initialize("代理对象");

    2.在需要禁用懒加载的映射文件中显示的加入lazy = "false"

    3.使用openSessionInView【需要借助于过滤器】

4、hibernate load与get区别?

  load :找不到数据的话会抛出org.hibernate.ObjectNotFoundException异常。此时hibernate会使用延迟加载加载机制

  get找不到的话会返回null。

如果查询不到数据,get 会返回 null,但是不会报错, load 如果查询不到数据,则报错ObjectNotFoundException
使用get 去查询数据,(先到一级/二级)会立即向db发出查询请求(select ...), 如果你使用的是 load查询数据,(先到一级、二级))即使查询到对象,返回的是一个代理对象,如果后面没有使用查询结果,它不会真的向数据库发select ,当程序员使用查询结果的时候才真的发出select ,这个现象我们称为懒加载(lazy)
5、hibernate的三种状态?

  在Hibernate中,对象有三种状态:临 时状态(Transient)、持久状态(Persistent)和游离状态(Detached)。

  处于持久态的对象也称为 PO(PersistenceObject),临时对象和游离对象也称为VO(ValueObject).

6、hibernate有几种查询方式?

  1、 属性查询2、 参数查询、命名参数查询3、 关联查询4、 分页查询5、 统计函数

7、hibernate的缓存机制

  Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存。

  1.Hibernate一级缓存又称为“Session的缓存”。

  Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。

  一级缓存中,持久化类的每个实例都具有唯一的OID。

8.Hibernate二级缓存又称为“SessionFactory的缓存”。

  由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。

  第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。

  Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。

9、简述一下 hibernate的优缺点?

  1.Hibernate的优缺点:
    优点:1、程序更加面向对象;
    2、提高了生产率;
    3、方便移植(修改配置文件);
    4、无侵入性。
  缺点:
    1、效率比JDBC略差;
    2、不适合批量操作。
如何优化hibernate?

  what ???

JavaEE部分

1、http get与Post区别?

  get:传参是通过url传输,有大小限制差不多2KB吧,安全级别差,服务端Request.QueryString["id"],

  post:传参是通过form的action方式提交到服务器,基本无大小限制,安全级别比get要强点,隐藏提交URL参数

2、解释一下什么是 servlet;

  Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其 他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。 Servlet是位于Web 服务器内部的服务器端的Java 应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机

3、servlet线程安全吗?为什么?

  servlet 是不安全的,同时一个servlet实现类只会有一个实例对象,也就是一个单利的、,所以多个线程是可能会访问同一个servlet实例对象的。

4、说一说 Servlet 的生命周期?

  servlet 有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。
  这个生存期由 javax.servlet.Servlet 接口的 init,service 和 destroy 方法表达。

5、SERVLET API 中 forward()与 redirect()的区别?

  forward是转发 是不显示URL请求,会发送一次请求 。两个资源之间是同一个 request对象,可以共享 request中的数据

  redirect()是重定向 而是重定向指向的新的URL,会发送两次请求。两个资源之间不是同一个 request对象,不可以共享  

6、拦截器、过滤器、监听器的区别?

  1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些 参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。filter 流程是线性的, url传来之后,检查之后,可保持原来的流程继续向下执行,被下一个filter, servlet接收等.

  2.监听器:这个东西在c/s模式里面经常用到,他会对特定的事件产生产生一个处理。监听在很多模式下用到。比如说观察者模式,就是一个监听来的。又比如struts可以用监听来启动。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。

  3.java的拦截器 主要是用在插件上,扩展件上比如 hivernate spring struts2等 有点类似面向切片的技术,在用之前先要在配置文件即xml文件里声明一段的那个东西。

7、jsp 有哪些内置对象?作用分别是什么?

  答:JSP 共有以下9个内置的对象:

    request 用户端请求,此请求会包含来自 GET/POST 请求的参数

    response 网页传回用户端的回应

    pageContext 网页的属性是在这里管理

    session 与请求有关的会话期

    application servlet 正在执行的内容

    out 用来传送回应的输出

    config servlet 的构架部件

    page JSP 网页本身

    exception 针对错误网页,未捕捉的例外

8、 jsp 有哪些动作?作用分别是什么?

  答:JSP 共有以下6种基本动作
    jsp:include:在页面被请求的时候引入一个文件。
    jsp:useBean:寻找或者实例化一个 JavaBean。
    jsp:setProperty:设置 JavaBean 的属性。
    jsp:getProperty:输出某个 JavaBean 的属性。
    jsp:forward:把请求转到一个新的页面。
    jsp:plugin:根据浏览器类型为 Java 插件生成 OBJECT 或 EMBED 标记
9、页面间对象传递的方法

  request, session, application, cookie 等

10、JSP 和 Servlet 有哪些相同点和不同点,他们之间的联系是什么?

  JSP 是 Servlet 技术的扩展,本质上是 Servlet 的简易方式,更强调应用的外表表达。 JSP编译后是"类 servlet"。 Servlet 和 JSP 最主要的不同点在于, Servlet 的应用逻辑是在 Java文件中,并且完全从表示层中的 HTML 里分离开来。而 JSP 的情况是 Java 和 HTML 可以组合成一个扩展名为.jsp 的文件。 JSP 侧重于视图, Servlet 主要用于控制逻辑。

11、MVC 的各个部分都有那些技术来实现?如何实现?

  答:MVC 是 Model-View-Controller 的简写。 Model 代表的是应用的业务逻辑(通过JavaBean, EJB 组件实现), View 是应用的表示面(由 JSP 页面产生), Controller 是提供应用的处理过程控制(一般是一个 Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

12、反射的优缺点?

  反射:就是正在运行动态读取这个类的完整信息。

  优点:java的反射机制就是增加程序的灵活性、

  缺点:缺点:

    (1)性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。

    (2)使用反射会模糊程序内内部逻辑:程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。

13、那些地方用到了反射?

    jdbc连接、常用框架、spring ioc、Java动态代理、jsp:useBean android加载布局文件等。

14、什么是Java序列化?

  我们有时候将一个 java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个 java对象,例如,要将 java 对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个 java 对象变成某个格式的字节流再传输,但是, jre 本身就提供了这种支持,我们可以调用 OutputStream 的 writeObject 方法来做,如果要让 java 帮我们做,要被传输的对象必须实现 serializable 接口,这样, javac 编译时就会进行特殊处理,编译的类才可以被 writeObject 方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable 接口,该接口是一个 mini 接口,其中没有需要实现的方法,implementsSerializable 只是为了标注该对象是可被序列化的。


Java集合部分

1、 ArrayList (线性表结构、数组)和 Vector 的区别
  a、这两个类都实现了List接口(List接口继承了Collection接口),

  b、Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。

2、HashMap 和 Hashtable 的区别

  a、HashMap线程不安全,HashTable线程安全。

  b、HashTable不允许null值(key和value都不可以) ,HashMap允许null值(key和value都可以)。

3、List 和 Map 区别?

  List集合是单列集合,Map集合是双列集合 通过key,value。

   List集合是有序集合,Map集合是无序集合。
  List此接口的用户可以对列表中每个元素的插入位置进行精确地控制。
  用户可以根据元素的整数 索引(在列表中的位置)访问元素,并搜索列表中的元素
4、 List, Set, Map 是否继承自 Collection 接口?

  List, Set 是, Map 不是
5、List、 Map、 Set 三个接口,存取元素时,各有什么特点?
  list:存储: 有序的 可重复的

    访问:可以for循环,foreach循环,iterator迭代器 迭代。

  set:存储:无序的 不重复的

    访问:可以foreach循环,iterator迭代器 迭代

  map:存储:存储的是一对一对的映射 ”key=value“,key值 是无序,不重复的。value值可重复

    访问:可以map中key值转为为set存储,然后迭代这个set,用map.get(key)获取value也可以 转换为entry对象 用迭代器迭代

6、 Map的数据结构

  1.散裂图HashMap

  2.链式散裂图LinkedHashMap

  3. 树形图 TreeMap

7、Arraylist与LinkedList(双向链表类)区别?

  ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。

  (1)ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。

  (2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引。

  (3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。

8、java中hashset和hashmap有什么区别

  1、HashSet底层是采用HashMap实现的。HashSet 的实现比较简单,HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的。
  2、HashMap的key就是放进HashSet中对象,value是Object类型的。
  3、当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet增加的那个对象,该行的value就是一个Object类型的常量

Java基础部分(直说重点部分)

1、"=="和 equals 方法究竟有什么区别?

  ==如果判断值类型的话,判断内容是否相同。如果判断引用类型则是判断内存地址是否相同

2、静态变量和实例变量的区别?

  在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

  实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

3、是否可以从一个 static 方法内部发出对非 static 方法的调用?
  非static方法可以访问static方法.

  static方法不能访问非static方法

4、Integer 与 int 的区别 

  int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。

  int的默认值为0,而Integer的默认值为null

  在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0

  Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数

5、请说出作用域 public, private, protected,以及不写时的区别

  这四个作用域的可见范围如下表所示。

  说明:如果在修饰的元素上面没有写任何访问修饰符,则表示 friendly。

6、重载与重写区别?

  重载是同一个类中,方法名称相同, 但是参数或个数不同。与返回值没有关系。

  重写是在多个类中, 产生继承关系。父类与子类的方法方法必须相同。

7、接口与抽象类的区别?

  区别:定义接口的关键字是:interface 而定义抽象类的关键字是:abstract。
    接口中成员不能有私有, 抽象类可以。
    接口中定义的成员, 是finl public static 类型, 抽象类没有。
    接口中的不能有普通方法, 抽象类中可以。
  相同:
    两个都不new,但是 接口与抽象类是面向对象必备知识,设计模式、重构代码有必然作用

8、 final, finally, finalize 的区别。

  final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
  finally 是异常处理语句结构的一部分,表示总是执行。
  finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可
  以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。 JVM 不保证此方法总被
  调用

9、Java的垃圾回收机制

  Java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。

  System.gc()

  Runtime.getRuntime().gc()

10、 反射的优缺点?

  反射:就是正在运行动态读取这个类的完整信息。

  优点:java的反射机制就是增加程序的灵活性、

  缺点:缺点:(

   (1)性能问题:使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。

   (2)使用反射会模糊程序内内部逻辑:程序员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。

11、那些地方用到了反射?

   例如: jdbc、Java常用框架、jdk的动态代理、android的加载布局文件

12、java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承, 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

  字节流,字符流。字节流继承于 InputStream OutputStream,字符流继承于InputStreamReaderOutputStreamWriter。在 java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。

13、字节流与字符流的区别

字节流什么都存,字符流只能存放中文

其他部分

1、xml与json的区别?

  不同:

    xml是重量级、json是轻量级

    xml比较占带宽、json占带宽小,易于压缩

    json在webservice 用的比较少、xml用的较多

  相同:

    两者都用在项目交互下 例如 移动app接口用的就是json、在web项目中与其他项目对接用xml较多。

    json常用解析方法 gson、jsonobject、jackson等 xml dom sax pull 解析

2、redis使用场景

  redis是 缓存数据库,能够减轻数据库访问操作,比关系数据访问效率高! 使用场景: 发送短信验证码计时、token生成。

3、JavaWeb安全编程

1、xss攻击

什么恶意执行javascript代码或html代码 例如获取用户cookie、论坛恶意留言

4、sql注入

5 尽量少用隐藏域、或不要暴露敏感数据信息。

  例如:很多网站忘记密码, 通过手机号码找回,前面是手机号码+图像验证码。点击下一步是讲上一个页面的手机号放到隐藏域中。发送验证码取隐藏域里面的值。这样我讲隐藏域里面的值修改自己的手机。就可以破解别人的账号密码

6、App接口设计一定要规范

  最好项目更新时最好用 网站安全扫描工具扫描一下。return instance;


Spring 概述
1. 什么是spring?
Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。

2. 使用Spring框架的好处是什么?
轻量:Spring 是轻量的,基本的版本大约2MB。

控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。

面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。

容器:Spring 包含并管理应用中对象的生命周期和配置。

MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。

事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。

异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。

3. 核心容器(应用上下文) 模块。
这是基本的Spring模块,提供spring 框架的基础功能,BeanFactory 是 任何以spring为基础的应用的核心。Spring 框架建立在此模块之上,它使Spring成为一个容器。

4. 什么是Spring IOC 容器?
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

5. IOC的优点是什么?
IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。IOC容器支持加载服务时的饿汉式初始化和懒加载。

6. ApplicationContext通常的实现是什么?
FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。

ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。

WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。

7. Bean 工厂和 Application contexts 有什么区别?
Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。

依赖注入
1. 什么是Spring的依赖注入?
依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

2. 有哪些不同类型的IOC(依赖注入)方式?
构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

3. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?
你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

Spring 的MVC
1. 什么是Spring的MVC框架?
Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。

2. DispatcherServlet
Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。

3. WebApplicationContext
WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。

4. 什么是Spring MVC框架的控制器?
控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。

5. @Controller 注解
该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。

6. @RequestMapping 注解
该注解是用来映射一个URL到一个类或一个特定的方处理法上。

 

多线程部分

1、什么是多线程?

  在一个应用程序中,同时,有多个不同的执行路径。

2、什么是线程同步、异步?

  线程同步表示,当前线程执行完后下一个线程接着执行。

  线程异步表示,  在一个应用程序中,同时,有多个不同的执行路径。例如 javaweb ajax android handler

3、线程之间如何同步

  线程之间同步使用 synchronized、wait 与 notify

4、什么是线程不安全?如何解决?

      就是在多个线程共享同一个数据会受到其他线程的干扰。如何解决:使用线程同步技术, 用上锁(synchronized)。 让一个线程执行完了,在让另一个线程执行。

5如何创建一个线程?有几种方法?

       继承thread类, 重写run方法、实现Runnalbe接口,重新run方法 , 启动一个线程用start();

6sleep() wait()有什么区别?

        a、sleep是让当前线程指定休眠时间,然后继续工作  不释放锁

        b、让当前线程wait则是等待,直到有线程通知notify()唤醒他才会重新工作。释放锁

7、什么是线程池?

  线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后在需要执行新的任务时重用这些线程而不是新建一个线程。线程池中线程的数量通常完全取决于可用内存数量和应用程序的需求。然而,增加可用线程数量是可能的。线程池中的每个线程都有被分配一个任务,一旦任务已经完成了,线程回到池子中并等待下一次分配任务。

8、为什么要线程池

  基于以下几个原因在多线程应用程序中使用线程是必须的:

      1. 线程池改进了一个应用程序的响应时间。由于线程池中的线程已经准备好且等待被分配任务,应用程序可以直接拿来使用而不用新建一个线程。

      2. 线程池节省了CLR 为每个短生存周期任务创建一个完整的线程的开销并可以在任务完成后回收资源。

      3. 线程池根据当前在系统中运行的进程来优化线程时间片。

      4. 线程池允许我们开启多个任务而不用为每个线程设置属性。

      5. 线程池允许我们为正在执行的任务的程序参数传递一个包含状态信息的对象引用。

      6. 线程池可以用来解决处理一个特定请求最大线程数量限制问题。

      9、什么是死锁?

     10、wait()方法和notify()方法干什么用的,wait()方法有什么使用限制,是哪儿都能用么?

 

struts2细节

resultmap:用于查询
resultype:主要用于向where查询语句中传入数据,常用于模糊查询

posted @ 2018-01-26 15:37  时光博客  阅读(492)  评论(0编辑  收藏  举报