zoukankan      html  css  js  c++  java
  • 一次笔试

     
     
    一 .注解有什么作用?请自定义一个注解
     

    1.java注解是指附加在代码中的一些元信息,    用于一些工具在编译、运行时,,,,,    进行  解析和使用,,,,   起到说明、配置的功能。
     
    @Retention(RetentionPolicy.RUNTIME)
    定义的这个注解是注解会在class字节码文件中存在,在运行时可以通过  反射  获取到。
    @Target({ElementType.TYPE,ElementType.METHOD}) 
     


    二.java是否存在内存泄露问题?若存在,请举例说明什么情况下会发送内存泄露?

      会。自己实现堆载的数据结构时有可能会出现内存泄露

    三.简述基于struts框架web应用的工作流程,并简述在struts中mvc的表现方式?

     a  在web应用启动时,加载并初始化ActionServlet,    ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各个配置对象中。

     b   当ActionServlet接收到一个客户请求时,首先检索和用户请求相匹配的ActionMapping实例,如果不存在,就返回用户请求路径无效信息。

     c.  如ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据   保存到ActionForm对象中。

     d.   根据配置信息决定是否需要表单验证。
     
    如果需要验证,就调用ActionForm的Validate()方法。
     
    如果ActionForm的Validate()方法返回null   或     返回一个不包含ActionMessage的  ActionErrors对象,就表示表单验证成功。
     

    e.ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。    如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。

    f.Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的JSP组件。

    g.ActionForward对象指向的jsp组件生成动态网页,返回给客户。
     
     
     


    四.说明   控制反转(IOC)   和   面向切面编程(AOP)    在spring中的应用
     
     

      spring 的优点?

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

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

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

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

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

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

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

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

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

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

    什么是DI机制?

    依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,
     
    具体的讲:当某个角色

    需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者   来  创建被调用者的实例。
     
    但在spring中创建被调用者的工作  不再由 调用者来完成,因此称为  控制反转。
     
     
    创建被调用者的工作由spring来完成,然后注入调用者  因此也称为依赖注入
     

    spring以动态灵活的方式来管理对象 , 注入的两种方式,属性注入构造注入
    设置注入的优点:直观,自然
    构造注入的优点:可以在构造器中  决定  依赖关系的顺序。
     
     

    什么是AOP?
    面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面

    1.面向切面编程  提供    声明式事务管理

    2.spring支持    用户 自定义的切面

    面向切面编程(aop)是对面向对象编程(oop)的补充,

    面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。

    AOP从   程序运行角度  考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,
    aop是动态的抽象,是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。


    aop框架具有的两个特征:

    1.各个步骤之间的良好隔离性

    2.源代码无关性

    DI 和 IOC 的区别
    DI 和 IOC 
    DI和IOC是差不多的概念。 

    一个重要特征是接口依赖,是把对象关系推迟到运行时去确定. 
    DI是一个初始化实例的过程,分为三种
     
    1.setter based
    2.constructor based
    3.interface based,在spring 中就是应用前两种;但又不仅仅是初始化实例,而且是运用接口的概念去实现这种注入依赖。静态地看,只是依赖一个接口,但实际运行起来,是依赖一个实现了该 接口的具体类。 
     
     
     

    IOC就是面向接口编程的应用 
     
     

    1.一个通常的做法(非面向接口编程的方法),对象A依赖对象B,B会作为A的属性,可以理解为A直接控制B; 

    2.IOC的做法,对象A依赖于接口C,而不直接依赖于实现了接口C的B,也就是A不能直接控制是哪个具体实现了C的B去做相应的事情,而是由我们控制可以由哪个实现了接口C的B去处理,也就是控制反过来了,是由B来决定了,而不是由A,实现就是面向接口编程。 
     

    AOP 
    AOP是动态代理的应用,将具体业务和相应的其它方面(比如日志,权限之类的)划分开来,业务不会知道还有没有其它的功能来辅助,需要的话我就给他加上一个配置就可以,而不用去修改业务代码。  
    而权限和日志则写在其它的类advice中,只要在配置中说明在调用业务方法时(或前,或后,或别的),调用一下advice就OK了。很容易把一个方面,比如权限或日志从业务代码中剥离出来。 
    在SPRING中,实现AOP的流程如下: 

    1.定义业务接口 
    2.定义业务实现类 
    3.定义interceptor注入类 
    4.配置Bean,设置class为proxyFactoryBean 
        设置其三个属性1.)proxyInterfaces为1 
               2.)interceptorNames为3 

               3.)target为2

    五.spring       MVC注解有哪些?分别有什么作用?
     

      4个基本的
      @Component、@Repository @Service、@Controller

      看字面含义,很容易却别出其中三个:
      @Controller 控制层,就是我们的action层
      @Service 业务逻辑层,就是我们的service或者manager层
      @Repository 持久层,就是我们常说的DAO层
     

      而@Component (字面意思就是组件),它在你确定不了事哪一个层的时候使用。
     
     

    六.hibernate  中的session的update()   和  saveOrUpdate()   load()与get()有什么区别?
     
     

      saveorupdate()如果传入的对象在数据库中有就做update操作,如果没有就做save操作。
    save()在数据库中生成一条记录,如果数据库中有,会报错说有重复的记录。


    hibernate中  get方法 load方法的根本区别
     

    如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,
    它可以放心的使用代理来延迟加载该对象。
     
    在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,
    那没办法,只能抛异常ObjectNotFoundException,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数
    据时抛异常,而不是在创建这个对象时。
     
    由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存
    在就可以使用load方法来实现延迟加载。 

    对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有
    就查数据库,数据库中没有就返回null。 

    虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在session缓存中找到了该id对应
    的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的
    代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或
    者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。 
     


    前面已经讲了,get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,
    没有就创建代理,实际使用数据时才查询二级缓存和数据库。 

    总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载

    ,如果在使用过程中发现了问题,就抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

    七.hibernate中的java对象有几种状态。                 其相互关系如何(区别和相互转换)

      在Hibernate中,对象有三种状态:临时状态持久状态游离状态

    临时状态:当new一个实体对象后,这个对象处于临时状态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被jre垃圾回收机制回收。

    这个对象所保存的数据与数据库没有任何关系,除非通过Session的save或者SaveOrUpdate把临时对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久对象;

    持久状态:持久化对象的实例在数据库中有对应的记录,并拥有一个持久化表示(ID)。

    对持久化对象进行delete操作后,数据库中对应的记录将被删除,那么持久化对象与数据库记录不再存在对应关系,持久化对象变成临时状态。持久化对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。

    在同步之前,持久化对象是脏的(Dirty)。

    游离状态:当Session进行了Close、Clear或者evict后,持久化对象虽然拥有持久化标识符和与数据库对应记录一致的值,但是因为会话已经消失,对象不在持久化管理之内,

    所以处于游离状态(也叫:脱管状态)。

    游离状态的对象与临时状态对象是十分相似的,只是它还含有  持久化标识

    八.事务是什么?有哪些属性,并简要说明这些属性的含义

      什么是事务
      事务是访问数据库的一个操作序列,数据库应用系统通过   事务  集来完成对数据库的存取。
     
    事务的正确执行使得数据库从一种状态转换成另一种状态。
     
      事务必须服从ISO/IEC所制定的ACID原则。
     
    ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写事务必须服从ISO/IEC所制定的ACID原则。
    ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。
     

     原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。
    如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生转换;
    如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换。

     一致性或可串性
    事务的执行使得数据库从一种正确状态转换成另一种正确状态。

    隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应显示给任何其他事务。

    持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。 
     



    九.简述在mysql中索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写2个方面)
     

      1)索引是一种特殊的文件,他们包含着对数表里所有记录的                  引用指针
      2)普通索引(由关键字key或者index定义的索引)的唯一任务是    加快对数据的访问速度

      3)普通索引允许被索引的数据列包含重复的值,如果能确定某个数列将只包含彼此不同的值,
        在为这个数据创建索引的时候就应该为关键字unique把他定义为一个唯一索引,也就是说。    唯一索引可以保证数据的唯一性

      4)主键是一种特殊的索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录    ,使用关键字primary key来创建

      5)索引可以覆盖多个数据列,如像index(columnA,columnB)索引

      6)索引可以极大的提高数据的查询速度,但是会降低插入,删除,更新表的速度,因为在执行这些操作的时候。还要  操作索引文件




    十.有这样一个需求:商品搜索结果列表需要按人气(用户每访问一次商品详情页面就+1)活销量排序;请分析技术上如何实现该需求?

       最开始的就是
    数据库有个人气表 每次访问就会更新 查询的时候连表查询
      还有就是用搜索引擎咯

    优化
    redis缓存记录人气数   每几小时持久化一次
     
     
  • 相关阅读:
    bash组织成树数据结构
    statickeyword于C和C++用法
    POJ2239 Selecting Courses【二部图最大匹配】
    MVC过滤器的详细讲解和示范样本
    hdoj 2602 Bone Collector 【01背包】
    下的生产环境was重新启动不同意,怎么做?
    Qt Model/View 的简单说明
    View与Model绑定注意事项 (视图无数据显示)
    Qt Delgate的使用 简单说明
    QAbstractTableModel中的data()到底执行几遍???
  • 原文地址:https://www.cnblogs.com/java2016/p/5414053.html
Copyright © 2011-2022 走看看